【发布时间】:2019-09-18 12:30:56
【问题描述】:
鉴于我有一个forward declared 类型:
class Foo;
我想为这种类型创建一个unique_ptr:
unique_ptr<Foo> pFoo;
这在visual-studio-2017 中运行良好,但我无法使其在visual-studio-2012 中运行。
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(1150):错误 C2027:使用未定义类型
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) : 编译类模板成员函数时void std::default_delete<_Ty>::operator ()(_Ty *) throw() const
与
[
_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的声明
在黑暗时代是否有解决方法,或者我可以不转发声明?
【问题讨论】:
-
pFoo是成员还是变量?另外,如果 Visual Studio 2012 的标准库不符合 C++11,你可以使用boost::scoped_ptr代替吗? -
@Artyer
pFoo是会员。我没有在这个项目中包含 Boost,而且我想我会在我这样做之前很久就放弃我的前瞻声明。 VS2012 确实支持unique_ptr,但是好像没有完全支持。 -
包含
pFoo的类的析构函数是在header还是.cpp中实现的? (默认/非用户声明算作“在标题中”。)如果是前者,请尝试后者。 -
@MaxLanghof 两个都试过了,对我都没有用:(
-
您可以尝试提供特定的删除器,它不需要完整的声明类。
标签: visual-studio-2017 visual-studio-2012 c++ visual-studio-2012 smart-pointers unique-ptr forward-declaration