template<typename T>
void f1(T var) { }
template<typename T>
void f2(T * var) { }
int main(void)
{
int i;
int * pi;
f1(i); // f1<int>(i); // T == int // OK
f1(pi);// f1<int*>(pi); // T == int * // OK
f2(&i); // f2<int*>(&i); // i is int // &i is int* // T == int * // ???
f2(pi); // f2<int*>(pi); // pi is int * // T == int * // ???
f2(&pi); // f2<int*>(&pi);
}
//: C05:FuncDef.cpp
#include <iostream>
using namespace std;
template<class T> T sum(T* b, T* e, T init = T()) {
while(b != e)
init += *b++;
return init;
}
int main() {
int a[] = { 1, 2, 3 };
cout << sum(a, a + sizeof a / sizeof a[0]) << endl; // 6
} ///:~
$ g++ -g y.cpp
y.cpp: In function ‘int main()’:
y.cpp:16:12: error: cannot convert ‘int*’ to ‘int**’
16 | f2<int*>(pi); // f2<int>(pi); // pi is int * // T == int * // ???
| ^~
| |
| int*
y.cpp:5:13: note: initializing argument 1 of ‘void f2(T*) [with T = int*]’
5 | void f2(T * var) { }
| ~~~~^~~
f2<int>(pi); // f2<int>(pi); // pi is int * // T == int * // ???
f2<int*>(&pi); // f2<int*>(&pi);
Обычно, если шаблонный тип внутри класса - то там всё логично. T или T* -реализует ровно тот тип, который передан в шаблонном аргументе или который будет выведен. А вот в этом примере ничего не понятно в этом смысле.
f1<int>(i); // f1<int>(i); // T == int // OK
f1<int*>(pi);// f1<int*>(pi); // T == int * // OK
f2<int>(&i); // f2<int>(&i); // i is int // &i is int* // T == int * // неправильно, T == int
f2<int>(pi); // f2<int>(pi); // pi is int * // T == int * // неправильно, T == int
f2<int*>(&pi); // f2<int*>(&pi); // T == int*
template<typename T>
void f2(T * var) { std::cout << var << " " << *var << std::endl; }
0x7ffd85542ccc 22079
0x7ffd85542dd0 1
0x7ffd85542cd0 0x7ffd85542dd0
int i;
int * pi;
template<typename T> void function1(T* begin ) { }
/* First instantiated from: insights.cpp:5 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
void function1<int>(int * begin) { }
#endif
template<typename T> void function2(T begin ) { }
/* First instantiated from: insights.cpp:6 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
void function2<int *>(int * begin) { }
#endif
int main(void) {
int * pointer;
function1 (pointer);
function2 (pointer);
}