Por que a especialização completa da função de modelo não é retirada do arquivo .cpp sem declaração?

O seguinte código não gera nenhum erro / aviso de compilação / linker:

// 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);
}

A saída surpreendentemente é:

A::foo(T)
A::foo(double)

Por que o compilador não é capaz de captar o corretoA::foo(double) no caso demain.cpp ?

Concorda que, não há nenhum problema como esperado, se houver uma declaração emA.h como abaixo:

template<> void A::foo (double);

Mas essa não é a preocupação, porque no momento do link, o compilador tem a versão especializada.

Além disso, está tendo duas versões diferentes da mesma funçãoComportamento Indefinido ?

questionAnswers(3)

yourAnswerToTheQuestion