VS 2010 : 2 个重载具有类似的转换
VS 2010 : 2 overloads have similar conversions
我不明白这里发生了什么
class A{};
class B : A {};
void func(A&, bool){}
void func(B&, double){}
int main(void)
{
B b;
A a;
bool bo;
double d;
func(b, bo);
}
编译时,Visual 2010 在线func(b, bo);
上给了我这个错误
2 overloads have similar conversions
could be 'void func(B &,double)'
or 'void func(A &,bool)'
while trying to match the argument list '(B, bool)'
我不明白为什么布尔参数不足以解决重载。我已经看到了这个问题,正如接受的答案所指出的那样,布尔应该更喜欢布尔超载。就我而言,我看到第一个参数不足以选择好的函数,但是为什么第二个参数不能解决歧义?
重载规则比您想象的要复杂一些。您可以分别查看每个参数,并为该参数选择最佳匹配项。然后,如果只有一个重载为每个参数提供最佳匹配,那就是调用的重载。在示例中,第一个参数的最佳匹配是 func
的第二个版本,因为它只需要将 B
转换为 B&
;func
的另一个版本需要将B
转换为B&
,然后B&
转换为A&
。对于第二个参数,func
的第一个版本是最佳匹配,因为它不需要转换。第一个版本对第二个参数具有最佳匹配,但它对第一个参数没有最佳匹配,因此不考虑它。同样,第二个版本对第一个参数具有最佳匹配,但它对第二个参数没有最佳匹配,因此不考虑它。现在没有func
的版本了,调用失败。
重载解析规则比皮特·贝克尔(Pete Becker(写的还要复杂。对于f
的每个重载,编译器不仅计算需要转换的参数数量,还计算转换的秩。
排名 1
无需转换
左值到重值转换
数组到指针的转换
函数到指针的转换
资格转换
等级 2
整体促销
浮点促销
排名 3
假设所有候选函数都是非模板函数,则当且仅当函数具有一个参数,该参数的排名优于其他候选函数中同一参数的排名,积分转换
浮点转换
浮积分转换
指针转换
指向成员转换的指针
布尔转换
并且其他参数的排名不差时,该函数获胜。
现在让我们看一下OP案例。
-
func(A&, bool)
:转换 B&->A& (排名 3( 为第一个参数,第二个参数的完全匹配(排名 1(。 -
func(B&, double)
:第一个参数的完全匹配(秩 1(,第二个参数的转换bool->double
(秩 3(。
结论:没有人赢。
相关文章:
- 构造函数和转换运算符之间的重载解析
- 如何在C++中正确重载运算符转换字符*?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- C++:从重载函数转换为 std::function
- 为什么选择转换运算符的重载?
- C++stoi:这两个重载都无法转换所有参数类型
- 为什么这个涉及重载运算符和隐式转换的C++表达式是不明确的
- C++ 函数重载不明确,没有自动类型转换
- C++ 运算符重载转换
- 派生类 插入和提取运算符重载以及基类与派生类之间的强制转换
- unordered_set使用重载运算符=设置转换
- C++:使用重载而不是动态强制转换通过基选择派生类
- 具有重载类型转换运算符的函数对象崩溃
- 类型转换运算符重载与 as 非成员函数
- 模板化转换运算符的重载解析
- 类型转换重载
- 转换重载函数是不明确的
- 联合上的类型转换重载而不重载 +=
- C++类型转换重载
- c++的强制转换重载等价