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

标签 c++

<分区>

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

正如预期的那样。

最佳答案

原因是因为模板函数只考虑在定义点可见的函数,而不考虑在实例化点可见的函数。如果它根据实例化可见性选择函数,那么您很可能会左右违反一个定义规则。我对相关问题的回答中有标准引用 Adding specializations of template functions later

关于c++ - 模板和非模板函数的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183859/

相关文章:

c++ - 我动态添加了一个按钮,我如何在 Qt 中的另一个空白中使用这个按钮?

c++ - LowLevelKeyboardProc 和 KeyboardProc

C++ - 在 Fedora Linux 上的 gcc

c++ - Qt - 如何创建一个包含 0 个或多个 float 窗口的空白区域

C++11 使用 pow() 和 std::complex 舍入错误

c++ - GCC .obj 文件输出不确定(.debug_info,PROGBITS 部分)

使用 protected 构造函数和复制构造函数创建 C++ 非堆工厂对象

c++ - 如何捕获 boost message_queue 返回 false

c++ - 在 C++ 的 nsIWebProgressListener::onStateChange 中获取选项卡索引

c++ - 使用 vsprintf 和文件操作