4

考虑以下函数声明:

template<typename T> f(const T& x); // Version 1
template<typename T1, typename T2> f(const MyClass<T1, T2>& x); // Version 2

如果我调用f与 没有关系的类型,MyClass将调用第一个版本。如果我f使用MyClass类型(无论模板参数类型是什么)调用,那么将调用第二个版本。但现在,考虑:

template<typename T1, typename T2, typename T3>
MyDerivedClass : public MyClass<T1, T2> {};

一个类型会调用什么版本的函数MyDerivedClass

4

1 回答 1

5

这在标准的第 13.3 节中处理。第 13.3/1 段指出:

这些上下文中的每一个都以自己独特的方式定义了一组候选函数和参数列表。但是,一旦确定了候选函数和参数列表,最佳函数的选择在所有情况下都是相同的: — 首先,候选函数的一个子集——那些具有适当数量的参数并满足某些其他条件的函数——被选择以形成一组可行的功能(13.3.2)。— 然后根据将每个参数与每个可行函数的相应参数匹配所需的隐式转换序列 (13.3.3.1) 选择最佳可行函数。

第一个是更好的匹配,因为它不涉及任何隐式转换。

于 2012-12-16T11:13:03.293 回答