Dlaczego pełna specjalizacja funkcji szablonu nie jest pobierana z pliku .cpp bez deklaracji?
Poniższy kod nie generuje kompilacji / błędu linkera / ostrzeżenia:
// A.h
#include<iostream>
struct A
{
template<typename T>
static void foo (T t)
{
std::cout << "A::foo(T)\n";
}
};
void other ();
// main.cpp
#include"A.h"
int main ()
{
A::foo(4.7);
other();
}
// other.cpp
#include"A.h"
template<>
void A::foo (double d)
{
cout << "A::foo(double)\n";
}
int other ()
{
A::foo(4.7);
}
Wynik zaskakująco brzmi:
A::foo(T)
A::foo(double)
Dlaczego kompilator nie jest w stanie odebrać poprawnegoA::foo(double)
w przypadkumain.cpp
?
Zgadzam się, że nie ma problemu zgodnie z oczekiwaniami, jeśli istnieje deklaracja wA.h
jak poniżej:
template<> void A::foo (double);
Ale to nie jest problem, ponieważ w czasie połączenia kompilator ma specjalną wersję.
Ponadto posiada 2 różne wersje tej samej funkcjiNiezdefiniowane zachowanie ?