将 unique_ptr 设为前向声明类型的解决方法 [英] Workaround for Making a unique_ptr to a Forward Declared Type

查看:65
本文介绍了将 unique_ptr 设为前向声明类型的解决方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

鉴于我有一个转发声明类型:

class Foo;

我想制作一个 unique_ptr到这种类型:

I want to make a unique_ptr to this type:

unique_ptr<Foo> pFoo;

这在 但我不能让它在 .

This works fine in visual-studio-2017 but I can't make it work in visual-studio-2012.

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1150): error C2027: use of undefined type Foo (....\src\STETestbed\STETestbed.cpp)
O:\Engine\stetestbed\include\STETestbed\ComponentDirector.h(26) :参见 Foo
的声明C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1149) : while 编译类模板成员函数 void std::default_delete<_Ty>::operator ()(_Ty *) throw() 常量

[
_Ty=Foo
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1444) :参见对函数模板实例化的引用 void std::default_delete<_Ty>::operator ()(_Ty *) throw() const 正在编译

[
_Ty=Foo
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\type_traits(743) :参见正在编译的类模板实例std::default_delete<_Ty>的参考

[
_Ty=Foo
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1281) :请参阅对正在编译的类模板实例化std::is_empty<_Ty> 的引用

[
_Ty=std::default_delete
]
O:\Engine\stetestbed\include\STETestbed\ComponentDirector.h(63) :参见正在编译的类模板实例std::unique_ptr<_Ty>的参考

[
_Ty=Foo
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1151):错误 C2338:无法删除不完整的类型 (....\src\STETestbed\STETestbed.cpp)
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1152):警告 C4150:删除指向不完整类型 Foo 的指针;没有调用析构函数 (....\src\STETestbed\STETestbed.cpp)
O:\Engine\stetestbed\include\STETestbed\ComponentDirector.h(26) :参见 Foo

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1150): error C2027: use of undefined type Foo (....\src\STETestbed\STETestbed.cpp)
O:\Engine\stetestbed\include\STETestbed\ComponentDirector.h(26) : see declaration of Foo
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1149) : while compiling class template member function void std::default_delete<_Ty>::operator ()(_Ty *) throw() const
with
[
_Ty=Foo
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1444) : see reference to function template instantiation void std::default_delete<_Ty>::operator ()(_Ty *) throw() const being compiled
with
[
_Ty=Foo
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\type_traits(743) : see reference to class template instantiation std::default_delete<_Ty> being compiled
with
[
_Ty=Foo
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1281) : see reference to class template instantiation std::is_empty<_Ty> being compiled
with
[
_Ty=std::default_delete
]
O:\Engine\stetestbed\include\STETestbed\ComponentDirector.h(63) : see reference to class template instantiation std::unique_ptr<_Ty> being compiled
with
[
_Ty=Foo
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1151): error C2338: can't delete an incomplete type (....\src\STETestbed\STETestbed.cpp)
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1152): warning C4150: deletion of pointer to incomplete type Foo; no destructor called (....\src\STETestbed\STETestbed.cpp)
O:\Engine\stetestbed\include\STETestbed\ComponentDirector.h(26) : see declaration of Foo

在黑暗时代是否有解决方法,或者我可以不提前声明?

Was there a workaround for that back in the dark ages, or can I just not forward declare?

推荐答案

正如 Jarod42 提到的 问题似乎是 需要完整的类型声明.

登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆