gpt4 book ai didi

C++编译错误: cannot convert from B to A,无构造函数,或构造函数重载歧义

转载 作者:行者123 更新时间:2023-12-03 03:13:03 25 4
gpt4 key购买 nike

我有一些代码意味着类型转换,尽管有转换方法,但无法编译...

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

最佳答案

错误信息表示这两个操作符

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();
}

关于C++编译错误: cannot convert from B to A,无构造函数,或构造函数重载歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58414863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com