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 ?

questionAnswers(3)

yourAnswerToTheQuestion