Warum wird die vollständige Spezialisierung der Vorlagenfunktion nicht ohne Deklaration aus der CPP-Datei übernommen?

Der folgende Code generiert keinen Kompilierungs- / Linker-Fehler / keine Warnung:

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

Die Ausgabe ist überraschenderweise:

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

Warum der Compiler nicht in der Lage ist, das richtige zu findenA::foo(double) im Falle vonmain.cpp ?

Stimmen Sie zu, dass es kein Problem wie erwartet gibt, wenn eine Erklärung in vorliegtA.h Wie unten:

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

Dies ist jedoch nicht das Problem, da der Compiler zum Zeitpunkt der Verknüpfung über die spezialisierte Version verfügt.

Außerdem gibt es 2 verschiedene Versionen der gleichen FunktionUndefiniertes Verhalten ?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage