说我有两个班:
"foo.h中"
#pragma once
class Foo
{
public:
Foo()
{
};
~Foo()
{
};
};
Run Code Online (Sandbox Code Playgroud)
"啊"
#pragma once
#include <memory>
class Foo;
class A
{
public:
A(){};
~A(){};
std::unique_ptr<Foo> foo;
};
Run Code Online (Sandbox Code Playgroud)
A持有unique_ptr的Foo.我不想包含Foo在"啊"中,所以我向前宣布它.通过Foo在"Ah"中向前声明类,我得到一个编译时错误:
error C2027: use of undefined type 'Foo'
error C2338: can't delete an incomplete type
Run Code Online (Sandbox Code Playgroud)
所以我下面这个文章就如何避免这种错误,并在它自己的.cpp文件,我还包括富移动A的析构函数:
"A.cpp"
#include "A.h"
#include "Foo.h"
A::A()
{
}
A::~A()
{
}
Run Code Online (Sandbox Code Playgroud)
在"A.cpp"中实现A的析构函数后,我能够编译程序,因为类Foo在"A.cpp"中已知.这似乎是合乎逻辑的,因为unique_ptr需要完整的类型来调用它的析构函数.但令我惊讶的是,在评论出A的构造函数(在"Ah"以及"A.cpp"中)后,我得到了同样的错误.这怎么可能?为什么编译器抱怨在A没有构造函数时无法调用Foo的析构函数?
编辑:我上传了4个文件,以便您可以测试该程序.我正在使用Visual Studio 2013的MSVC++.
Lig*_*ica 21
构造函数需要以与析构函数相同的方式访问删除器:异常安全性要求构造函数能够在构造函数的主体抛出的情况下回滚所有成员的初始化:
[C++14: 12.6.2/10]:在非委托构造函数中,可能会调用每个可能构造的类类型子对象的析构函数(12.4).[注意:此规定确保在抛出异常时可以为完全构造的子对象调用析构函数(15.2). - 尾注]
有关:
“A”不可能没有构造函数。
如果您注释了您编写的构造函数,编译器将为您创建一个默认构造函数,并且它不一定位于您定义的构造函数的同一位置。导致上述问题。