【发布时间】:2014-04-20 03:02:46
【问题描述】:
我有以下代码:
#include <iostream>
template <typename T>
void f (T) { std::cout << "f(T)" << std::endl; }
template <typename T>
void f (bool) { std::cout << "f(bool)" << std::endl; }
int main ( )
{
f(true); // #1 prints f(T)
f<bool>(true); // #2 prints f(bool)
}
#1 线路调用f(T),而#2 线路调用f(bool)。
为什么会这样?以及选择重载模板函数的规则是什么?
更新
我了解到,在第一次调用中,编译器在尝试调用第二个函数时无法推断出T,因此选择了第一个。
在第二次调用中,第二个函数被认为是在 gcc 上更好的匹配,而第一个是在 VS2013 下选择的。谁在这里做正确的事?顺便说一句,我仍然对过程的完整描述感兴趣。
【问题讨论】:
-
不知道规则,但我看不出编译器如何在你的第二个模板中推断出
T,所以我看不出如果没有明确的参数如何选择它。 (但同样,我对模板细节一无所知。)
标签: c++ templates overloading overload-resolution