unique_ptr无法删除SDL_Window,因为它是一个不完整的类型(VC ++ Express 2013)

时间:2014-03-30 22:58:14

标签: c++ sdl-2

我尝试在cpp中使用unique_ptrSDL_Window,但它是一个不完整的类型,在我第一次尝试编译代码时出错,我创建了我的自己的删除器结构,但它仍然无法正常工作,所以这就是我尝试的方式:

struct SDLWindowDeleter{
    void operator()(SDL_Window* window) {
        SDL_DestroyWindow(window);
    }
};

这是窗口的创建:

std::unique_ptr<SDL_Window, SDLWindowDeleter> 
Initializer::create(Uint32 w, Uint32 h, std::string title) {

    std::unique_ptr<SDL_Window, SDLWindowDeleter> window;
    startSDL();

    window = std::unique_ptr<SDL_Window, SDLWindowDeleter>
             (SDL_CreateWindow(title.c_str(), 0, 0, w, h, SDL_WINDOW_OPENGL));

    return window;
}

并接收我使用的窗口:

window = std::move(Initializer::create(500, 500, "Title"));

编译器的错误是:

Error   1   error C2027: use of undefined type 'SDL_Window' c:\program files\microsoft visual studio 12.0\vc\include\memory 1198    1   game
Error   2   error C2338: can't delete an incomplete type    c:\program files\microsoft visual studio 12.0\vc\include\memory 1199    1   game
Error   4   error C2679: binary '=' : no operator found which takes a right-hand operand of type 'SDLWindowDeleter' (or there is no acceptable conversion)  c:\program files\microsoft visual studio 12.0\vc\include\memory 1424    1   game

这第三个错误我无法理解为什么,因为如果它是一个结构,不需要重载二进制操作数&#39; =&#39;。

我应该使用&#34;非安全&#34;指针?或者有某种方法来解决这个错误?

1 个答案:

答案 0 :(得分:2)

这是std :: move的定义:

template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t );

由于函数“Initializer :: create”返回智能指针“std :: unique_ptr”,所以在你的代码中,std :: move将返回对智能指针“std :: unique_ptr”的引用,而不是“SDLWindowDeleter”类型,这就是你得到这个编译器错误的原因。

您应该更改以下句子中的“window”变量,以便输入std::unique_ptr<SDL_Window, SDLWindowDeleter> window

window = std::move(Initializer::create(500, 500, "Title"));