Visual studio 2017 为前向声明的类型生成唯一的\u ptr的变通方法
鉴于我有一种类型: 我想对这种类型做一个比较:Visual studio 2017 为前向声明的类型生成唯一的\u ptr的变通方法,visual-studio-2017,visual-studio-2012,c++,smart-pointers,unique-ptr,forward-declaration,visual-studio,Visual Studio 2017,Visual Studio 2012,C++,Smart Pointers,Unique Ptr,Forward Declaration,Visual Studio,鉴于我有一种类型: 我想对这种类型做一个比较: unique_ptr<Foo> pFoo; unique_ptr pFoo; 这在我的工作中很好,但我不能让它在我的工作 C:\Program Files(x86)\Microsoft Visual Studio 11.0\VC\include\memory(1150):错误C2027:使用未定义的类型Foo(..\src\STETestbed\STETestbed.cpp) O:\Engine\stetestbed\include
unique_ptr<Foo> pFoo;
unique_ptr pFoo;
这在我的工作中很好,但我不能让它在我的工作
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:\ProgramFiles(x86)\Microsoft Visual Studio 11.0\VC\include\memory(1149):编译类模板成员函数时
与
[
_Ty=Foo
]
C:\Program Files(x86)\Microsoft Visual Studio 11.0\VC\include\memory(1444):请参阅正在编译的函数模板实例化void std::default\u delete::operator()(_Ty*)throw()const
与
[
_Ty=Foo
]
C:\Program Files(x86)\Microsoft Visual Studio 11.0\VC\include\type\u traits(743):请参阅正在编译的类模板实例化std::default\u delete
与
[
_Ty=Foo
]
C:\ProgramFiles(x86)\Microsoft Visual Studio 11.0\VC\include\memory(1281):请参阅正在编译的类模板实例化的参考std::is_empty
与
[
_Ty=std::默认值_删除
]
O:\Engine\stetestbed\include\stetestbed\ComponentDirector.h(63):请参阅对正在编译的类模板实例化std::unique\u ptr
的参考
与
[
_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的声明
在黑暗时代有没有解决方法,或者我可以不向前声明吗?问题似乎是,默认的删除器需要在声明时实现一个完整的类型。的后一个版本只需要在调用圆括号运算符时使用完整类型
我们可以通过提供一个函子来解决这个问题,函子提供了一个不需要完整类型声明的deleter:
template <typename T>
void custom_deleter(T* param) {
delete param;
}
在定义了Foo
的实现文件中,我们需要将其指定为:
pFoo = decltype(pFoo)(new Foo, std::function<void(Foo*)>(custom_deleter<Foo>))
pFoo=decltype(pFoo)(新的Foo,std::函数(自定义删除器))
pFoo
是成员还是变量?另外,如果visual studio 2012s标准库不符合C++11,您是否可以使用boost::scoped_ptr
替代?@ArtyerpFoo
是成员。我还没有在这个项目中加入Boost,我想我早就放弃了我的远期声明。VS2012确实支持unique\u ptr
,但是的,它似乎没有得到完全支持。包含pFoo
的类的析构函数是在头中还是在中实现的.cpp
?(默认/非用户声明的计数为“在标头中”。)如果是前者,请尝试后者。@MaxLanghof尝试了两者,但对我都不起作用:(您可以尝试提供不需要声明中完整类的特定删除器。struct custom_Deleter{template void operator()(t*param)const{delete param;}
将允许std::unique_ptr pFoo;
并简单地pFoo=decltype(pFoo)(新Foo);
(无论如何,您可能应该使用custom\u make_unique来包装)@Jarod42哇,谢谢。我尽量避免像瘟疫一样new
和delete
,所以我对它们不太熟悉。但是当我查到这一点时,是的,你完全正确。delete
已经为我处理了nullptr
案例。我已经编辑过了。@Jarod42我也尝试过将其包装在struct custom\u deleter中代码>但是我得到了这个错误:“警告C4150:删除指向不完整类型的指针Foo;
没有调用析构函数”我将问一个关于如何实现它的后续问题。@Jarod42我在这里问了一个后续问题:
unique_ptr<Foo, function<void(Foo*)>> pFoo
pFoo = decltype(pFoo)(new Foo, std::function<void(Foo*)>(custom_deleter<Foo>))