重载的功能模板

时间:2013-10-21 20:14:42

标签: c++

我有2个重载的功能模板:

template <class typ1, class typ2>
void szab(typ1, typ2) {cout << "2 typy" << endl;}

template <class typ1>
void szab(typ1, typ1) {cout << "1 typ" << endl;}

当我调用这样的函数时,为什么没有歧义:szab(1, 1);? Isnt 2nd template是第一个特殊版本吗?当我在模板中声明2个参数时,它并不意味着它们必须是不同的类型,它们只是可以。为什么编译器会选择第二个模板呢?

1 个答案:

答案 0 :(得分:4)

第二个是“更专业的模板”并且需要更少的“替代”,编译器选择它作为重载决策阶段的最佳选择。

Per§14.5.6.2(功能模板的部分排序):

  

部分排序选择两个功能模板中的哪一个更多   通过依次转换每个模板来实现专业化(参见   下一段)并使用。执行模板参数推导   功能类型。扣除过程确定是否其中之一   模板比另一个更专业。如果是这样,就越多   专用模板是由部分排序选择的模板   过程