【发布时间】:2014-04-23 12:44:03
【问题描述】:
给定以下代码:
#include <iostream>
using namespace std;
template<typename T> void Print(T t) {
cout << t << endl;
}
template<> void Print<int>(int t) {
cout << "int = " << t << endl;
}
void Print(int i) {
cout << "int2 = " << i << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Print(1.3);
Print("tese");
Print(2);
char c;
cin >> c;
return 0;
}
为什么调用 Print(2) 没有歧义,而是调用 void Print(int i) ?
ps:使用 bcc64.exe 和 cl.exe 测试。
【问题讨论】:
-
因为重载解析首先从一组常规函数和主模板中选择最佳匹配。只有完成后,它才会寻找专业化。 Herb Sutter 有一篇关于这个怪癖的 GOTW 文章。 Here.
-
@jrok 这是不正确的
-
@PierreBdR 哦。它不适用于这种情况,我承认(我的阅读不好)但否则它是正确的:)
-
@jrok 这不是。重载解析找到具有最佳参数的函数。如果两个函数具有完全相同的参数列表,如果一个是模板化的而另一个不是,那么只有非模板化的函数具有优先权。这比你的说法弱很多。
标签: c++ templates overloading template-specialization overload-resolution