0

可能重复:
模板函数和非模板函数调用顺序

为什么这个代码代码打印

::foo(int)
::foo<T>(T)

 

template <typename T>
void foo(T)
{
   std::cout << "::foo<T>(T) \n";
}

template <typename T>
void bar(T baz)
{
   foo(baz);
}

void foo(int)
{
   std::cout << "::foo(int) \n";
}

int main()
{
   foo(0);
   bar(0); 
}

而这

void foo(int)
{
   std::cout << "::foo(int) \n";
}

template <typename T>
void foo(T)
{
   std::cout << "::foo<T>(T) \n";
}

template <typename T>
void bar(T baz)
{
   foo(baz);
}

int main()
{
   foo(0);
   bar(0); 
}

印刷

::foo(int)
::foo(int)

正如预期的那样。

4

1 回答 1

4

原因是模板函数只考虑在定义点可见的函数,而不考虑在实例化点可见的函数。如果它根据实例化可见性选择函数,那么您很可能会违反左右一个定义规则。我对相关问题的回答中有一个标准参考稍后添加模板函数的专业化

于 2012-08-29T18:07:53.297 回答