c++ - C++ 类类型转换失败

标签 c++ type-conversion incomplete-type

我正在尝试编译某些内容,但它不会,而且我在网络上找不到任何相关内容。

#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;

我不知道我做错了什么,也不知道在哪里可以找到有关该主题的更多信息。

谢谢

最佳答案

您没有发布错误的全文,这意味着您遗漏了所有重要的行号。通常情况下,行号通常是错误中最有值(value)的信息。

class A;
class B
{
    ...
};
B::operator A() {return x;}

我猜测这是您的编译器告诉您发生错误的行。

在这行代码中,编译器还没有完整的 A 声明,因此它不知道如何将 int x 转换为 class A 。 C++ 编译是单遍编译,因此它不能推迟此查找。

您需要先完成声明,然后再进行定义。

class A;
class B
{
    int x;
public:
    B(int i=107) {x=i;}
    operator A();
};

class A
{
    int x;
public:
    A(int i=6) {x=i;}
    int get_x() {return x;}
};

// done with declarations. begin definitions.

B::operator A() {return x;}
// compiler quietly expands this to be:
// B::operator A() { return A::A(i=this->x); }

通常 AB 将位于头文件中,并且您将在 .cpp 文件的某处保留定义,这需要完全声明这两个类。

关于c++ - C++ 类类型转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30762401/

相关文章:

c - 如何在 MISRAC :2012 that follows Dir 4. 12 和 4.8 中创建模块?

c++ - 在没有事件异常的情况下调用线程终止

C++ 如何加入多播 mpeg 流?

Haskell unsafe将新类型强制转换为相同的新类型

c++ - 为什么允许我们获取不完整类型的地址?

c - 在 c 中的 header 中使用枚举

c++ - 在 C++ 中使用递归将数字加倍

c++ - 在带有 Windows/Cygwin 的 Netbeans 中使用 gnuplot-iostrem 库进行编译时出现问题

javascript - Null 是类型对象,所以它是真的吗?幕后发生了什么?

c# - 如何智能安全地将 Double 转换为 String?