Podczas nauki i eksperymentowania z szablonami natknąłem się na coś, czego nie mogłem w pełni zrozumieć.W jaki sposób argumenty szablonów są rozwiązywane/wydedukowane?
class sample
{
public:
sample(int a = 0) {}
};
template <typename T1,typename T2>
void add(T1 a) // Replace T1 with T2 resolves compilation error.
{}
int main()
{
add<sample>(3);
return 0;
}
Powyższy kod powoduje błąd kompilacji (zarówno 03, jak i 0x 0x). Ale kiedy zmieniam typ argumentu dodawania z T1 na T2, jest w porządku. Przy nm, utworzony prototyp to add (sample, int) [T1 = sample, T2 = int]. Dlaczego kompilacja kończy się niepowodzeniem z T1 jako typem argumentu, ale nie T2?