VS 2010:2次重载有类似的转换

时间:2012-08-23 15:32:10

标签: c++ overloading

我不明白这里发生了什么

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)'

我不明白为什么bool参数不足以解决重载问题。 我见过this question,并且在接受的答案中指出,bool应该更喜欢bool重载。在我的情况下,我看到第一个参数不足以选择好的函数,但为什么第二个参数不能解决歧义?

2 个答案:

答案 0 :(得分:5)

重载规则比您猜测的要复杂一些。您分别查看每个参数,并为该参数选择最佳匹配 。然后,如果只有一个重载为每个参数提供最佳匹配,那就是被调用的那个。在示例中,第一个参数的最佳匹配是func的第二个版本,因为它只需要将B转换为B&;另一版本的func要求将B转换为B&,然后将B&转换为A&。对于第二个参数,func的第一个版本是最佳匹配,因为它不需要转换。第一个版本与第二个参数具有最佳匹配,但它与第一​​个参数没有最佳匹配,因此不予考虑。类似地,第二个版本与第一个参数具有最佳匹配,但它与第二个参数没有最佳匹配,因此不予考虑。现在没有func的版本,呼叫失败。

答案 1 :(得分:2)

重载解析规则比Pete Becker写的复杂得多。 对于f的每个重载,编译器不仅计算需要转换的参数的数量,还计算转换的等级。

等级1

  

无需转换

     

Lvalue-to-rvalue转换

     

数组到指针的转换

     

功能指针转换

     

资格转换

等级2

  

整体促销

     

浮点促销

等级3

  

整体转化

     

浮点转换

     

浮动积分转换

     

指针转换

     

指向成员转化的指针

     

布尔转换

假设所有候选者都是非模板函数,当且仅当它具有一个参数,其等级优于其他候选者中相同参数的等级并且其他参数的等级不差时,函数才会胜出。 / p>

现在让我们来看一下OP案例。

  • func(A&, bool):转换B& - > A& (第3级)第1个参数, 第二个参数的完全匹配(等级1)。
  • func(B&, double):第一个参数的完全匹配(排名1),第二个参数的转换bool->double(排名3)。

结论:没有人获胜。