C++ 模板和非模板函数的意外输出

C++ 模板和非模板函数的意外输出,c++,C++,可能重复: 为什么要打印此代码 ::foo(int) ::foo<T>(T) 正如所料。原因是模板函数只考虑在定义点可见的函数,而不考虑在实例化点可见的函数。如果它根据实例化可见性选择函数,则很可能违反了“左一定义”规则。在我对相关问题的回答中有一个标准参考,原因是模板函数只考虑在定义点可见的函数,而不考虑在实例化点可见的函数。如果它根据实例化可见性选择函数,则很可能违反了“左一定义”规则。我在回答有关问题DUP时有一个标准的参考,虽然我不能认为它是一个答案,但在你的问题的上下文

可能重复:

为什么要打印此代码

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

正如所料。

原因是模板函数只考虑在定义点可见的函数,而不考虑在实例化点可见的函数。如果它根据实例化可见性选择函数,则很可能违反了“左一定义”规则。在我对相关问题的回答中有一个标准参考,原因是模板函数只考虑在定义点可见的函数,而不考虑在实例化点可见的函数。如果它根据实例化可见性选择函数,则很可能违反了“左一定义”规则。我在回答有关问题

DUP时有一个标准的参考,虽然我不能认为它是一个答案,但在你的问题的上下文中值得一读:DUP,虽然我不能认为它是一个答案,但在你的问题的上下文中值得一读:我想(这不是100%)。如果你把你的函数原型放在任何定义之前,这也会解决这个问题,即使原型是半随机的。只要它们都在定义之前,我认为这也行得通。我认为(不是100%)如果你把你的函数原型放在任何定义之前,这也会解决这个问题,即使原型是以半随机顺序排列的。只要它们都领先于定义,我认为这也行得通。
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)