为什么即使从未使用了数据类型,为什么还不够

Why is a forward declaration not enough even if the data type is never used

本文关键字:为什么 不够 数据类型 未使用      更新时间:2023-10-16

我知道已经提出了类似的问题,并且有答案描述在下面描述下面声明还不够的情况下。但是,这些答案并不能说明为什么还不够。因此,我认为这不是一个重复的问题。

我很难理解为什么编译器必须在以下情况下看到数据类型的定义(foward声明不够):

让我们考虑一下我们有一个简单的" main.cpp",如下所示除了包括标题文件" myclass.hpp"

之外,绝对什么也没有
#include <MyClass.hpp>
int main(int argc, char **argv)
{
    return 0;
}

现在,让我们考虑一下" myclass.hpp"的内容如下:

#include <vector>
class Data1;
class MyClass
{
public:
    MyClass();                                      // default constructor
    MyClass(MyClass const & p_other);               // copy constructor
    MyClass(MyClass && p_other);                    // move constructor
    ~MyClass();                                     // destructor
    MyClass & operator=(MyClass const & p_rhs);     // copy assignment
    MyClass & operator=(MyClass && p_rhs);          // move assignment
private:
    Data1 *            m_a; // forward decl. always OK
    Data1              m_b; // forward decl. always not OK
    std::vector<Data1> m_c; // forward decl. OK if MyClass is not instantiated
};

myClass包含几个成员变量:

  • " m_a"是指" data1"的指针,
  • " m_b"是" data1",
  • 的实例
  • " m_c"是一个具有" data1"元素的向量。

" data1"的定义尚未包含在" myclass.hpp"中,也不包含在" main.cpp"中。它只是向前声明。

编译器从来没有成员变量" m_a"的问题,它不需要其定义来编译" main.cpp" - 即使我们会诱使" myclass"。

由于我们没有实例化" myclass",因此编译器也没有成员变量" m_c"的问题。在这种情况下,它也不需要" data1"的定义。

但是,编译器与成员变量" m_b"有问题:

impl1.hpp:16:24:错误:字段'm_b'具有不完整的类型'data1'

我的简单问题是:为什么?

请考虑我们有用户定义的默认构造函数,复制构造函数,移动构造函数,用户定义的破坏者和用户定义的副本评估操作员和移动分配运营商,即编译器不必为任何这些构造函数/方法生成代码。所以出于什么目的仅编译" main.cpp"?

时,编译器需要查看" data1"的定义。

有人知道答案吗?

MyClass的大小取决于 Data1的大小,只有从 Data1 defution 中才能知道。这就是为什么您不能将类型不完整作为字段中的字段。