Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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
C++ “”:在使用自定义删除程序创建共享\u ptr时,无法将“初始值设定项列表”转换为“std::shared\u ptr”_C++_Shared Ptr - Fatal编程技术网

C++ “”:在使用自定义删除程序创建共享\u ptr时,无法将“初始值设定项列表”转换为“std::shared\u ptr”

C++ “”:在使用自定义删除程序创建共享\u ptr时,无法将“初始值设定项列表”转换为“std::shared\u ptr”,c++,shared-ptr,C++,Shared Ptr,我为SDL2库方法创建了包装函式,以返回带有自定义删除器的智能指针。对于unqiue_ptr类映像,它似乎工作正常,但对于在生成期间返回共享_ptr类窗口的类,它给出了以下错误: :无法从“初始值设定项列表”转换为“std::shared\u ptr” 此处的SDL_CreateWindow返回原始SDL_Window*,IMG_加载返回原始SDL_曲面* 我已经尝试过将Deleter移动到public并删除Window类的复制限制,但仍然失败,并出现了相同的错误。另外,如果我只是从窗口的函数强

我为SDL2库方法创建了包装函式,以返回带有自定义删除器的智能指针。对于unqiue_ptr类映像,它似乎工作正常,但对于在生成期间返回共享_ptr类窗口的类,它给出了以下错误:

:无法从“初始值设定项列表”转换为“std::shared\u ptr”

此处的SDL_CreateWindow返回原始SDL_Window*,IMG_加载返回原始SDL_曲面*

我已经尝试过将Deleter移动到public并删除Window类的复制限制,但仍然失败,并出现了相同的错误。另外,如果我只是从窗口的函数强制转换中返回nullptr,那么它构建得很好。因此,问题似乎在于共享ptr本身的创建。让我感到奇怪的是,为什么它可以与唯一的而不是共享的ptr一起工作

布拉格语一次 包括 包括 包括不可压缩的 //生成期间失败,错误为: //无法从“初始值设定项列表”转换为“std::shared\u ptr” 类窗口:私有不可压缩{ 私人: 公众: 类删除器{ 无效运算符DL_窗口*窗口{ SDL_窗口; } }; 静态常数int屏幕宽度=800; 静态常数int屏幕高度=600; std::共享的ptr运算符常量{ 返回标准::共享\u ptr SDL_CreateWindowSDL教程, SDL_窗口位置未定义, SDL_窗口位置未定义, 屏幕宽度, 屏幕高度, 显示SDL_窗口_, 删除器; } }; 布拉格语一次 包括 包括 包括 包括 包括不可压缩的 //建造良好 类映像:私有不可压缩{ 公众: 类删除器{ 无效运算符DL_曲面*图像{ SDL_自由曲面图像; } }; std::unique_ptr运算符const std::string&path const{ 返回std::unique\u ptr IMG_Loadpath.c_街, 删除器; } }; 预期结果:窗口类应该像图像类一样无错误地生成

实际结果:Window类失败,出现上面给出的错误,而Image类构建得很好


更新:通过将共享的\u ptr创建逻辑移到simple函数,我发现移除定制的Deleter可以移除构建错误。因此,这似乎是罪魁祸首。但我需要删除器,还有,为什么同样的构造可以使用unique_ptr处理图像

我已经精简了您的示例:

包括 //把这些删掉,因为我们没有它们,它们也不重要 //关于问题的实质。 结构SDL_窗口{}; 作废SDL_销毁窗口SDL_窗口*win{delete win;} SDL_窗口*SDL_创建窗口{返回新的SDL_窗口{};} //生成期间失败,错误为: //无法从“初始值设定项列表”转换为“std::shared\u ptr” 类窗口{ 公众: 类删除器{ 无效运算符DL_窗口*窗口{ SDL_窗口; } }; std::共享的ptr运算符常量{ 返回标准::共享\u ptr SDL_CreateWindow, 删除器; } }; int main { 自动赢=窗口; 自动sp=win; } 现在问题更加明显了:

/usr/local/include/c++/8.2.0/bits/shared_ptr_base.h:642:11: error: 
  'void Window::Deleter::operator()(SDL_Window*)' is private within this context
        __d(__p); // Call _Deleter on __p.
        ~~~^~~~~

main.cpp:16:14: note: declared private here
         void operator()(SDL_Window *window) {
看它活下去

如果您将public添加到deleter类或使其成为结构,它将起作用。但是,您也可以跳过该类,直接传入deleting函数(如果需要完成全部工作),或者使用lambda(如果有点复杂):

std::共享的ptr运算符常量{ 返回标准::共享\u ptr SDL_CreateWindow, SDL_窗口; } //或者使用lambda,如果这里更复杂,也可以使用工厂函数 静态std::共享的ptr创建{ 返回标准::共享\u ptr SDL_CreateWindow, []自动赢{ 取消注册; SDL_赢得了胜利; }; } 看它的工作现场直播


同样,像这样使用Window::操作符是否明智也值得怀疑。我建议您使用非成员或静态成员工厂函数来制作windows。

谢谢!成功了。我正要问你们为什么它对返回unique_ptr的Image类有效,但用你们的修复程序再次重建,这次我得到了编译器更明确的错误:“`error C2248'Image::Deleter::operator”:无法访问在类'Image::Deleter'SDLGame'中声明的私有成员,所以它也需要public:”。为什么编译器没有对共享的ptr发出明确的警告仍然是个谜。模板错误常常是压倒性的,而且很难在噪音中找到信号。我会责怪的-另外,感谢您指出设计中的缺陷。我没有想到直接使用这个函数。我将采用你建议的第一种工厂方法。不客气。我在上面的最后一个代码段和最后一个Coliru链接中添加了一个工厂函数,该链接利用了工厂函数。PS,谢谢 感谢你接受这个答案。如果你想表现出额外的爱,你也可以投票支持我的答案-我投了赞成票。但作为我的代表