说我有两个班:
“foo.h中”
#pragma once
class Foo
{
public:
Foo()
{
};
~Foo()
{
};
};
“啊”
#pragma once
#include <memory>
class Foo;
class A
{
public:
A(){};
~A(){};
std::unique_ptr<Foo> foo;
};
A持有 unique_ptr
的 Foo
。我不想包括 Foo
在“A.h”,所以我向前宣布它。通过向前宣布课程 Foo
在“A.h”中,我得到一个编译时错误:
error C2027: use of undefined type 'Foo'
error C2338: can't delete an incomplete type
所以我跟着 这个 有关如何避免此错误的文章,并将A的析构函数移入其自己的.cpp文件中,其中我还包含Foo:
“A.cpp”
#include "A.h"
#include "Foo.h"
A::A()
{
}
A::~A()
{
}
在“A.cpp”中实现A的析构函数后,我能够编译程序,因为类Foo在“A.cpp”中已知。这似乎是合乎逻辑的,因为unique_ptr需要完整的类型来调用它的析构函数。但令我惊讶的是,在评论出A的构造函数(在“A.h”以及“A.cpp”中)之后,我得到了同样的错误。这怎么可能?为什么编译器抱怨在A没有构造函数时无法调用Foo的析构函数?
编辑: 我上传了4个文件,因此您可以测试该程序。 我正在使用Visual Studio 2013的MSVC ++。