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();
}
我有一些隐含类型转换的代码,尽管有转换方法但无法编译...
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 中删除
- 将错误行重写为
A a = b.operator A();
...
operator int
报错信息的意思是这两个运算符
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();
}