具有模板和非模板功能的意外输出

时间:2012-08-29 18:01:44

标签: c++

  

可能重复:
  Template func and non template func call order

为什么要打印此代码?

::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)

正如所料。

1 个答案:

答案 0 :(得分:4)

原因是模板函数仅考虑在定义点可见的函数,而不考虑在实例化时可见的函数。如果它基于实例化可见性选择了函数,那么您最有可能违反左边和右边的一个定义规则。在我对相关问题Adding specializations of template functions later

的回答中有一个标准参考