考虑以下函数声明:
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
类型调用哪个版本的函数?
答案 0 :(得分:5)
这在标准的第13.3节中处理。第13.3 / 1段指出:
这些上下文中的每一个都定义了候选函数集和 参数列表以其独特的方式。但是,曾经的候选人 函数和参数列表已经确定,选择 在所有情况下,最好的功能是相同的: - 首先,一个子集 候选函数 - 具有适当数量的参数和 满足某些其他条件 - 被选中以形成一套可行的 功能(13.3.2)。 - 然后选择最佳可行功能 关于每个需要匹配的隐式转换序列(13.3.3.1) 每个可行函数的相应参数的参数。
第一个是更好的匹配,因为它不会涉及任何隐式转换。