разрешение спецификации и перегрузки шаблонов c ++

Я прочитал Шаблоны почему бы не специализировать функции и, немного поэкспериментировав, Нашел интересную вещь. Вот файл 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

10
задан ls. 9 June 2011 в 17:11
поделиться