Я прочитал Шаблоны почему бы не специализировать функции и, немного поэкспериментировав, Нашел интересную вещь. Вот файл main.cxx:
// main.cxx
#include
// Declarations
/*
template
void foo(T);
template<>
void foo(int*);
template
void foo(T*);
*/
// Definition and specification
template
void foo(T x)
{
std::cout << "T version." << std::endl;
}
template<>
void foo(int *i)
{
std::cout << "int* version." << std::endl;
}
template
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
РЕДАКТИРОВАТЬ: упростите этот вопрос после того, как увидел ответ AProgrammer