自定义重载max模板函数调用歧义求助:指定<int>报错,<double>正常
为什么
::max<int>(4,7)歧义但::max<double>(4,7)正常? 一、::max<int>(4,7)触发歧义的原因
我们拆解两个模板在该调用下的实例化过程:
- 带返回类型参数的第二个模板:
模板定义为template<typename RT, typename T1, typename T2> RT max(T1 a, T2 b)。当显式指定RT=int时,T1和T2会从实参4、7(均为int)推导为int,最终实例化出:int max(int, int) - auto返回的第一个模板:
模板定义为template <typename T1, typename T2> auto max(T1 a, T2 b)。当你写::max<int>(4,7)时,显式指定了第一个模板参数T1=int,第二个参数T2从实参7推导为int,最终实例化出:auto max(int, int) // auto推导返回类型为int - 重载决议冲突:
两个实例化后的函数签名完全一致(均为int(int, int)),编译器无法区分调用目标,因此抛出歧义错误。
二、::max<double>(4,7)无歧义的原因
同样拆解实例化过程:
- 带返回类型参数的第二个模板:
显式指定RT=double,T1和T2从实参推导为int,实例化出:double max(int, int) - auto返回的第一个模板:
显式指定T1=double,T2从实参7推导为int,实例化出:auto max(double, int) // auto推导返回类型为double(int与double运算会提升为double) - 重载决议无冲突:
两个实例化的函数签名不同:一个是double(int, int),另一个是double(double, int)。调用实参为两个int时,匹配第二个模板不需要任何类型转换(参数完全匹配),而匹配第一个模板需要将第一个int转为double。根据C++重载决议规则,参数匹配更精确的函数会被优先选择,因此编译器能明确选择第二个模板,不会产生歧义。
内容的提问来源于stack exchange,提问作者Sandeep Nagar
相关产品推荐
相关产品推荐

