我无法使用std :: unique_ptr进行前向声明。我已在SO和其他地方在线阅读其他类似的帖子,但这些帖子中的答案都没有直接解决我的问题,或者我误解/误解了答案。因此,如果有人认为这是一个重复的问题(特别是参考Is std::unique_ptr<T> required to know the full definition of T?),请澄清原始问题中的答案如何帮助我下面的例子,因为我试过并且无法弄明白。< / p>
为了说明我遇到的问题,我使用以下代码文件构建了一个项目:
//main.cpp
int main(int argv, char* argv[]) { return 0;}
//Composite.h
#pragma once
#include<memory>
class Individual;
class Composite
{
public:
Composite();
~Composite();
private:
std::unique_ptr<Individual> mInd;
};
//Composite.cpp
#include "Composite.h"
Composite::Composite() {}
Composite::~Composite() {}
//Individual.h
#pragma once
class Individual
{
public:
Individual();
~Individual();
};
//Individual.cpp
#include "Individual.h"
Individual::Individual() {}
Individual::~Individual() {}
我无法在Visual Studio 2017中编译上述项目。基本上编译器抱怨:
错误C2027:使用未定义类型&#34;个人&#34;
错误C2338:无法删除不完整的类型
请注意,Composite
和Individual
都不会被实例化,这是为了说明问题。无论我在SO和其他地方发现什么,似乎都建议上面的文件应该编译,因为:
Individual
之前知道Composite
的完整定义。由于Composite
从未实例化,因此不应存在编译错误。那么,为什么编译错误?
P.S。我在Is std::unique_ptr<T> required to know the full definition of T?阅读了这篇文章。在接受的答案中提供了一个我无法理解的表格。该表中的构造函数/析构函数要求是否适用于拥有类或构造std :: unique_ptr的类?事实上,对答案的第三个评论基本上建议提供一些澄清,但就我所知,评论没有得到回应。
提前感谢所有那些急于求助的人。