2

我在 C++ 中使用带有删除器的 std::unique_ptr 时遇到问题。下面是代码的样子:

std::unique_ptr<SDL_Surface> srf( SDL_CreateWindow(...), SDL_DestroyWindow );

这就是代码的样子。下面是 VS express 抛出的错误。

Error   1   error C2664: 'std::unique_ptr<_Ty>::unique_ptr(SDL_Surface *,const std::default_delete<_Ty> &) throw()' : cannot convert parameter 2 from 'void (__cdecl *)(SDL_Window *)' to 'const std::default_delete<_Ty> &'

请发布我如何才能得到这个解释,谢谢。

4

2 回答 2

2

删除器的类型是 unique_ptr 类型的一部分,必须指定为模板参数:

std::unique_ptr<SDL_Surface, decltype(SDL_DestroyWindow)*>
    srf(SDL_CreateWindow(...), SDL_DestroyWindow);

默认情况下它是 a std::default_delete,并且指向的指针SDL_DestroyWindow不能转换为它。

于 2013-09-01T19:44:08.670 回答
1

您可以专门std::default_delete针对您的类型:

namespace std {
  template<>
  struct default_delete<SDL_Window> {
    void operator()(SDL_Window* ptr) const {
      SDL_DestroyWindow(ptr);
    }
  };
}

然后你可以在std::unique_ptr<SDL_Window>不明确指定删除器的情况下构造:

std::unique_ptr<SDL_Window> sfr(SDL_CreateWindow(...));

但是,您应该知道,如果您忘记在代码中包含特化,SDL_Window将与 unspecialized 一起删除std::default_delete,这只是 deletes 指针。

于 2013-09-01T20:09:56.993 回答