我有下一堂课:
State.hpp
...
class Engine;
namespace window
{
class State
{ ... } }
WConsole.hpp
...
class Engine;
namespace window
{
class Console: public State
{ .. } }
WMesssage.hpp
...
class Engine;
namespace window
{
class Message: public State
{ ... } }
所有课程都链接到Engine类:
Engine.hpp
...
namespace window
{
class State;
class Console;
class Message;
}
class Engine
{
...
std::vector< std::unique_ptr<window::State> > m_windowObjects;
std::unique_ptr<window::Console> m_consoleWindow;
std::unique_ptr<window::Message> m_messageWindow;
...
}
在Engine.cpp中我包含了标题:
#include "Engine.hpp"
#include "WState.hpp"
#include "WConsole.hpp"
#include "WMessage.hpp"
如果我尝试编译,我会收到此错误:
In file included from /usr/include/c++/4.8.2/memory:81:0,
from /usr/local/include/SFGUI/Signal.hpp:6,
from /usr/local/include/SFGUI/Object.hpp:4,
from /usr/local/include/SFGUI/Widget.hpp:4,
from /usr/local/include/SFGUI/Container.hpp:4,
from /usr/local/include/SFGUI/Bin.hpp:4,
from /usr/local/include/SFGUI/SFGUI.hpp:6,
from ./include/Handler.hpp:4,
from main.cpp:1:
/usr/include/c++/4.8.2/bits/unique_ptr.h: In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = window::Console]':
/usr/include/c++/4.8.2/bits/unique_ptr.h:184:16: required from 'std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = window::Console; _Dp = std::default_delete<window::Console>]'
./include/Engine.hpp:21:7: required from here
/usr/include/c++/4.8.2/bits/unique_ptr.h:65:22: error: invalid application of 'sizeof' to incomplete type 'window::Console'
static_assert(sizeof(_Tp)>0,
^
/usr/include/c++/4.8.2/bits/unique_ptr.h: In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = window::Message]':
/usr/include/c++/4.8.2/bits/unique_ptr.h:184:16: required from 'std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = window::Message; _Dp = std::default_delete<window::Message>]'
./include/Engine.hpp:21:7: required from here
/usr/include/c++/4.8.2/bits/unique_ptr.h:65:22: error: invalid application of 'sizeof' to incomplete type 'window::Message'
从我看到的我没有得到关于window :: State的错误,所以意味着我以正确的方式介绍它,但为什么我得到关于window :: Console和window :: Message的错误? 可能会影响那个类窗口::控制台和窗口::消息来自window :: State?
答案 0 :(得分:2)
unique_ptr
的类型参数必须是许多用例的完整类型(有关详细信息,请参阅注释);前向宣布的课程是不完整的。您必须具有可见类的完整定义。
答案 1 :(得分:2)
我修改为shared_ptr,但包括标题仍然是一个选项。
以下是可能遇到同样错误here
的人的链接