Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2017 为前向声明的类型生成唯一的\u ptr的变通方法_Visual Studio 2017_Visual Studio 2012_C++_Smart Pointers_Unique Ptr_Forward Declaration_Visual Studio - Fatal编程技术网

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
替代?@Artyer
pFoo
是成员。我还没有在这个项目中加入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>))