说我有两类:的unique_ptr和前瞻性声明
“foo.h中”
#pragma once
class Foo
{
public:
Foo()
{
};
~Foo()
{
};
};
“A.H”
#pragma once
#include <memory>
class Foo;
class A
{
public:
A(){};
~A(){};
std::unique_ptr<Foo> foo;
};
A持有的Foo
一个unique_ptr
。我不想在“A.h”中包含Foo
,所以我向前宣布了它。通过只向前声明类Foo
在“啊”,我得到一个编译时错误:
error C2027: use of undefined type 'Foo'
error C2338: can't delete an incomplete type
所以我下面就如何避免这个错误this文章,并在它自己的.cpp文件,我搬到A的析构函数还包括富:
“A.cpp”
#include "A.h"
#include "Foo.h"
A::A()
{
}
A::~A()
{
}
在“A.cpp”实施的析构函数后,我能够编译程序,因为Foo类是已知“ A.cpp”。这似乎是合乎逻辑的,因为unique_ptr需要完整的类型来调用它的析构函数。但令我惊讶的是,在评论完A的构造函数(在“A.h”以及“A.cpp”)后,我得到了同样的错误。这怎么可能?当A没有构造函数时,为什么编译器会抱怨不能调用Foo的析构函数?
编辑: 我上传了4个文件,以便测试该程序。 我使用MSVC++的Visual Studio 2013年
http://www.filedropper.com/test_61
'A'确实有一个构造函数,当你注释掉你constructo r:编译器提供了一个默认的构造函数,这个构造函数获得了一个内联定义。 – dyp 2014-12-06 21:32:46
是的,但使用标准构造函数,我得到编译器错误,他无法删除完整类型。在编写我自己的空构造函数时,它应该看起来像默认的那样,我不会看到这些编译错误。 – abcheudg234 2014-12-06 21:40:29
向我们展示不起作用的代码? – 2014-12-06 21:44:44