转发声明和std :: unique_ptr

时间:2017-08-06 17:22:47

标签: c++ unique-ptr forward-declaration

我无法使用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:无法删除不完整的类型

请注意,CompositeIndividual都不会被实例化,这是为了说明问题。无论我在SO和其他地方发现什么,似乎都建议上面的文件应该编译,因为:

  1. 编译器需要在实例化Individual之前知道Composite的完整定义。由于Composite从未实例化,因此不应存在编译错误。
  2. 许多在线解决方案建议在.cpp文件中定义一个空的析构函数(而不是在头文件中定义它)应解决与std :: unique_ptr和不完整类型相关的问题。我在上面的文件中已经这样做了。
  3. 那么,为什么编译错误?

    P.S。我在Is std::unique_ptr<T> required to know the full definition of T?阅读了这篇文章。在接受的答案中提供了一个我无法理解的表格。该表中的构造函数/析构函数要求是否适用于拥有类或构造std :: unique_ptr的类?事实上,对答案的第三个评论基本上建议提供一些澄清,但就我所知,评论没有得到回应。

    提前感谢所有那些急于求助的人。

0 个答案:

没有答案