¿Por qué la especialización completa de la función de plantilla no se recoge del archivo .cpp sin declaración?

El siguiente código no genera ningún error de compilación / vinculador / advertencia:

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

La salida sorprendentemente es:

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

¿Por qué compilador no es capaz de recoger el correctoA::foo(double) en caso demain.cpp ?

De acuerdo en que, no hay problema como se espera, si hay una declaración enA.h como abajo:

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

Pero esa no es la preocupación, porque en el momento del enlace, el compilador tiene la versión especializada.

Además, está teniendo 2 versiones diferentes de la misma función unComportamiento indefinido ?

Respuestas a la pregunta(3)

Su respuesta a la pregunta