'sizeof' 对不完整类型的无效应用(创建的类)

新手上路,请多包涵

我有下一节课:

状态.hpp

     ...

    class Engine;

    namespace window
    {

    class State
    { ... } }

WConsole.hpp

     ...

    class Engine;

    namespace window
    {

    class Console: public State
    { .. } }

WMessage.hpp

     ...

    class Engine;

    namespace window
    {

    class Message: public State
    { ... } }

所有类都链接到 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::Console 和 window::Message 派生自 window::State?

原文由 AlexxanderX 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 792
2 个回答

我修改为 shared_ptr,但包括标题仍然是一个选项。

这是 此处 可能有相同错误的人的链接

原文由 AlexxanderX 发布,翻译遵循 CC BY-SA 3.0 许可协议

unique_ptr 的类型参数对于很多用例来说必须是一个完整的类型(详见注释);前向声明的类不完整。您必须具有可见类的完整定义。

原文由 Alan Stokes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题