为什么要打印此代码?
::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)
正如所料。
答案 0 :(得分:4)
原因是模板函数仅考虑在定义点可见的函数,而不考虑在实例化时可见的函数。如果它基于实例化可见性选择了函数,那么您最有可能违反左边和右边的一个定义规则。在我对相关问题Adding specializations of template functions later
的回答中有一个标准参考