Я прочитал Почему не специализировать шаблоны функций и после эксперимента немного, Я нашел интересную вещь. Здесь перейдите 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);
}
Интересная вещь: если я оставлю часть объявления прокомментированной, поведение будет таким же, как сказано в статье, т.е. версия T * будет использоваться, если определение версии int * предшествует ее определению, а также тиху и стиху. Однако, если раскомментировать блок объявления, будет вызываться только версия int * независимо от того, какой заказ я использую в определениях или объявлениях. Мой вопрос заключается в том, как это выражение влияет на разрешение?
Любые идеи? Я использую g++ 4.2.2 на x86_64-redhat-linux
EDIT: упростите этот вопрос после ответа AProgrammer