gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:52:23 33 4
gpt4 key购买 nike

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

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

第三个错误我不明白为什么,因为如果它是一个结构,不需要重载二进制操作数'='。

我应该使用“非安全”指针吗?或者有什么方法可以解决这个错误?

最佳答案

这是 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"));

关于c++ - unique_ptr 无法删除 SDL_Window,因为它是一个不完整的类型(VC++ Express 2013),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22751033/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com