C ++重载优先于Specialization?

时间:2014-04-23 12:44:04

标签: c++ templates overloading template-specialization overload-resolution

给出以下代码:

#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进行测试。

3 个答案:

答案 0 :(得分:3)

标准的第13.3.3节,在选择最佳的重载函数时,明确指出如果在具有完全相同的参数列表的模板化和非模板化函数之间进行选择,则非模板化函数始终为比模板化的更适合。

答案 1 :(得分:2)

这是因为非模板功能是一等公民。有关详细信息,请参阅Herb Sutter的this articlethis SO post

来自Herb Sutter的文章:

  

非模板功能是一等公民。一个与参数类型以及任何函数模板匹配的普通旧的非模板函数将被选择在一个非常好的函数模板上。

     

如果没有一流的公民可供选择至少同样好,那么接下来就咨询二等公民的功能基础模板。选择哪个功能基础模板取决于哪个匹配最佳,并且是#34;最专业的&#34; (重要提示:根据一系列相当神秘的规则,使用&#34;专门的&#34;奇怪的是与模板专业化无关;它只是一个不幸的口语):

答案 2 :(得分:-2)

因为您没有将其写为Print<int> (2)

用尖括号书写它意味着你要调用模板函数。由于您没有通过编写尖括号来调用确切的模板函数。它之后不会与任何调用Print (any integer);发生冲突。因为那时模板功能并不存在。

请参阅标题Name Resolution下的C ++工作草案部分Templates。 希望它有所帮助。