我尝试在cpp中使用unique_ptr
与SDL_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;指针?或者有某种方法来解决这个错误?
答案 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"));