Почему полная специализация шаблонной функции не берется из файла .cpp без объявления?

Следующий код не генерирует компиляцию / ошибку компоновщика / предупреждение:

// 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::foo(T)
A::foo(double)

Почему компилятор не может подобрать правильныйA::foo(double) в случаеmain.cpp ?

Согласитесь, что, как и ожидалось, проблема не возникает, если вA.h как ниже:

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

Но это не проблема, потому что во время компиляции компилятор имеет специализированную версию.

Кроме того, имеет 2 разные версии одной и той же функции иНеопределенное поведение ?

Ответы на вопрос(3)

Ваш ответ на вопрос