Скажем, у меня есть два класса:
"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 содержит a unique_ptr
of Foo
. Я не хотел включать Foo
в "A.h" , поэтому я просил объявить его. Просто объявив класс Foo
в "A.h" , я получаю ошибку времени компиляции:
error C2027: use of undefined type 'Foo'
error C2338: can't delete an incomplete type
Итак, я следил за этой статьей о том, как избежать этой ошибки, и переместил деструктор в свой собственный .cpp файл, где я также включаю Foo:
"a.cpp"
#include "A.h"
#include "Foo.h"
A::A()
{
}
A::~A()
{
}
После реализации деструктора A в "A.cpp" я могу скомпилировать программу, потому что класс Foo известен в "A.cpp" . Это кажется логичным, потому что unique_ptr нуждается в полном типе, чтобы назвать его деструктором. Но, к моему удивлению, после комментирования конструктора A (в "A.h" , а также "A.cpp" ), я получаю ту же ошибку. Как это возможно? Почему компилятор жалуется на невозможность вызвать Foo destructor, когда A не имеет конструктора?
EDIT: Я загрузил 4 файла, чтобы вы могли протестировать программу. Я использую MSVС++ Visual Studio 2013.