次のコードは、コンパイル/リンカー エラー/警告を生成しません。
// 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 つの異なるバージョンが未定義の動作ですか?