【问题标题】:C++ Overloading takes precedence over Specialization?C ++重载优先于专业化?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    来自 Herb Sutter 的文章:

    非模板函数是一等公民。与参数类型以及任何函数模板相匹配的普通旧非模板函数将被选择,而不是其他情况相同的函数模板。

    如果没有至少一样好的一等公民可供选择,那么接下来咨询二等公民的功能基础模板。选择哪个函数基模板取决于哪个匹配最好并且是“最专业的”(重要说明:奇怪的是,“专业”的这种使用与模板专业化无关;这只是一种不幸的口语)根据一组公平神秘的规则:

    【讨论】:

      【解决方案3】:

      因为你没有写成Print&lt;int&gt; (2)

      用尖括号编写它意味着您正在调用模板函数。由于您没有通过编写尖括号来调用确切的模板函数。它与以后的任何调用Print (any integer); 都不冲突。因为那个时候模板函数不存在。

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

      【讨论】:

        猜你喜欢
        • 2020-07-18
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 2016-08-07
        • 2011-10-29
        • 1970-01-01
        • 2021-07-26
        相关资源
        最近更新 更多