【发布时间】:2015-06-10 16:42:06
【问题描述】:
我正在尝试编译某些东西,但它不会,而且我在网络上找不到任何相关内容。
#include<iostream>
using namespace std;
class A;
class B
{
int x;
public:
B(int i=107) {x=i;}
operator A();
};
B::operator A() {return x;}
class A
{
int x;
public:
A(int i=6) {x=i;}
int get_x() {return x;}
};
int main()
{
A a;
B b=a;
cout<<a.get_x();
return 0;
}
我得到错误: 返回类型“A 类”不完整 请求从“A”转换为非标量类型“B”
即使这样也行不通:
B B;
A a=b;
我不知道自己做错了什么,也不知道在哪里可以找到有关该主题的更多信息。
谢谢
【问题讨论】:
-
将
B::operator A() {return x;} 移动到class A之后。那就是`'A类'的本质是不完整的` -
谢谢。但是我想知道为什么 A 类的前向声明不起作用?
-
如果不首先重载
=运算符,则无法使用=将对象从 B 类转换为 A 类。 -
@IleanaProfeanu 你有B类上面的前向声明,但是下面的实际定义,所以B类甚至不知道A类是什么。前向声明通常用在头文件中。如果您将 B 类移到 A 类下方,则不需要前向声明。
-
@CNomad 在这种情况下,复制构造函数被调用,所以即使没有重载也可以使用'='
标签: c++ type-conversion incomplete-type