- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
<分区>
我知道已经有人问过类似的问题,并且有答案描述在下面描述的情况下前向声明是不够的。但是,这些答案并没有说明为什么还不够。因此,我不认为这是一个重复的问题。
我很难理解为什么编译器必须在以下情况下查看数据类型的定义(前向声明是不够的):
假设我们有一个简单的“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包含几个成员变量:
“Data1”的定义既不包含在“MyClass.hpp”中,也不包含在“main.cpp”中。它只是前向声明。
编译器从来没有成员变量“m_a”的问题,它不需要它的定义来编译“main.cpp”——即使我们实例化“MyClass”也是如此。
因为我们没有实例化“MyClass”,所以编译器对成员变量“m_c”也没有问题。在这种情况下,它也不需要定义“Data1”。
但是,编译器对成员变量“m_b”有问题:
Impl1.hpp:16:24: error: field 'm_b' has incomplete type 'Data1'
我的简单问题是:为什么?
请考虑我们有用户定义的默认构造函数、拷贝构造函数、移动构造函数、用户定义的析构函数和用户定义的复制赋值运算符和移动赋值运算符,即编译器不必为这些构造函数/方法中的任何一个生成代码。那么为了什么目的呢编译器只编译“main.cpp”时需要查看“Data1”的定义?
有人知道答案吗?
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!