C++ compilation error: cannot convert from B to A, no constructor, or constructor overload ambiguity

C++ compilation error: cannot convert from B to A, no constructor, or constructor overload ambiguity

我有一些隐含类型转换的代码,尽管有转换方法但无法编译...

class A
{
public:
    A(void) :_m(0) { }
    A(int val) : _m(val) {}
private:
    int _m;
};
class B
{
public:
    B(void) : _m(0) {}
    B(int val) : _m(val) {}
    B(const A&);
    // there is a direct conversion operator here
    operator A(void) const { return A(_m); }
    operator int(void) const { return _m; }
private:
    int _m;
};
int main()
{
    B b;
    A a = (A)b; // error C2440 here
}

错误信息如下:

error C2440: 'type cast': cannot convert from 'B' to 'A'
message : No constructor could take the source type, or constructor overload resolution was ambiguous

据我了解,编译器会尝试多种路径来解释 a = (A)b

  • 它找到 operator A
  • 但它还在 B 上找到了 operator int,并且 A(int) 构造函数为其提供了第二条路径 B => int => A...

而且它不知道该选择哪个。

要修复编译问题,我可以:

  • 从 B
  • 中删除 operator int
  • 将错误行重写为A a = b.operator A();...

报错信息的意思是这两个运算符

operator A(void) const { return A(_m); }
operator int(void) const { return _m; }

可以用在表达式

(A)b;

因此使用这些转换运算符可以使用构造函数 A( int ) 或默认复制构造函数 A( const A & ).

为了更清楚重写相应的声明,如

A a = A( b );

那么对象b是使用第一个转换运算符转换为A类型的对象,还是使用第二个转换运算符转换为int类型的对象。

您可以避免声明运算符的歧义,例如

operator A(void) const & { return A(_m); }
operator int(void) const && { return _m; }

对于左值,将使用第一个运算符,对于右值,将使用第二个运算符。

这是您的程序,其中包含修改后的运算符。

#include <iostream>
class A
{
public:
    A(void) :_m(0) { }
    A(int val) : _m(val) {}
private:
    int _m;
};
class B
{
public:
    B(void) : _m(0) {}
    B(int val) : _m(val) {}
    B(const A&);
    // there is a direct conversion operator here
    operator A(void) const & { return A(_m); }
    operator int(void) const && { return _m; }
private:
    int _m;
};

int main()
{
    B b;
    A a = b; 
    A a1 = B();
}