Следующий код не генерирует ошибок/предупреждений компиляции/компоновщика:
// 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);
Но это не проблема, потому что во время компоновки у компилятора есть специализированная версия.
Кроме того, не является ли наличие двух разных версий одной и той же функции неопределенным поведением?
template <> void A::foo<double>(double d)
? - person Kerrek SB   schedule 26.10.2012