関数テンプレートを特殊化しない理由を読み、少し実験した後、興味深いものを見つけました。ここにmain.cxxがあります:
// main.cxx
#include <iostream>
// Declarations
/*
template<class T>
void foo(T);
template<>
void foo(int*);
template<class T>
void foo(T*);
*/
// Definition and specification
template<class T>
void foo(T x)
{
std::cout << "T version." << std::endl;
}
template<>
void foo(int *i)
{
std::cout << "int* version." << std::endl;
}
template<class T>
void foo(T *x)
{
std::cout << "T* version" << std::endl;
}
int main(int argc, char** argv)
{
int *p;
foo(p);
}
興味深いのは、宣言部分にコメントを付けたままにすると、動作は記事に記載されているとおりです。つまり、int *バージョンの定義がその定義の前にあり、その逆の場合はT*バージョンが使用されます。ただし、宣言ブロックのコメントを解除すると、定義または宣言で使用する順序に関係なく、int*バージョンのみが呼び出されます。私の質問は、この宣言がどのように決議に影響を与えるようになるのかということです。
何か案は?x86_64-redhat-linuxでg++4.2.2を使用しています
編集:AProgrammerの答えを見た後、この質問を単純化してください