Почему полная специализация шаблонной функции не берется из файла .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 разные версии одной и той же функции иНеопределенное поведение ?