#include <iostream>
template <class T>
void foo(T) {
std::cout << "foo(T)" << std::endl;
}
template <class T>
void foo(T*) { //#3
std::cout << "foo(T*)" << std::endl;
}
#define TEST
#ifdef TEST
template <>
void foo(int*) { //#1
std::cout << "foo(int*)" << std::endl;
}
#else
template <>
void foo<int*>(int*) { //#2
std::cout << "foo<int*>(int*)" << std::endl;
}
#endif
int main(int argc, char **argv) {
int* p = 0;
foo(p);
return 0;
}
jaka jest różnica między # 1 i # 2. Jeśli zdefiniuję TEST, # 1 działa. Ale jeśli skomentuję to, # 3 pracuję ... A jaki jest właściwy sposób pisania specjalizacji szablonów funkcji ...Specjalizacja szablonów funkcji nie powiodła się?
Istnieją pewne konteksty, gdzie jest to wygodne lub niezbędne do określenia argumentu szablon (y) . Oczywistym miejscem, w którym należy podać argumenty, jest to, czy argument szablonu nie jest wydedukowany. Miejsca, w których jest to wygodne, to kiedy musisz przekierować argument do odpowiednio skonwertowanego typu. Jeśli chcesz jawnie określić argument, często nie możesz użyć przeciążenia. –