Я создал функторы-обертки для методов библиотеки SDL2, чтобы возвращать умные указатели с пользовательскими удалителями.Кажется, что это нормально работает для unqiue_ptr (класс Image), но выдает следующую ошибку для классов, возвращающих shared_ptr (класс Window) во время сборки:
'<function-style-cast>': cannot convert from 'initializer list' to 'std::shared_ptr<SDL_Window>'
SDL_CreateWindow
здесь возвращает raw SDL_Window*
и IMG_Load
возвращает необработанное SDL_Surface*
.
Я пытался переместить Deleter
в общедоступный и удалить ограничения на копирование класса Window, но все равно не удается с той же ошибкой.Кроме того, если я просто верну nullptr
из приведения функции Window, он будет работать нормально.Таким образом, проблема, похоже, связана с созданием самого shared_ptr.Что меня поражает, так это то, что он отлично работает с unique_ptr
, но не shared_ptr
.
#pragma once
#include <memory>
#include <SDL.h>
#include "Uncopyable.h"
// fails during build with error: '<function-style-cast>':
// cannot convert from 'initializer list' to 'std::shared_ptr<SDL_Window>'
class Window:private Uncopyable {
private:
public:
class Deleter {
void operator()(SDL_Window *window) {
SDL_DestroyWindow(window);
}
};
static const int SCREEN_WIDTH = 800;
static const int SCREEN_HEIGHT = 600;
std::shared_ptr<SDL_Window> operator()() const {
return std::shared_ptr<SDL_Window>(
SDL_CreateWindow("SDL Tutorial",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH,
SCREEN_HEIGHT,
SDL_WINDOW_SHOWN),
Deleter());
}
};
#pragma once
#include <memory>
#include <string>
#include <SDL.h>
#include <SDL_image.h>
#include "Uncopyable.h"
// builds fine
class Image: private Uncopyable {
public:
class Deleter{
void operator()(SDL_Surface *image) {
SDL_FreeSurface(image);
}
};
std::unique_ptr<SDL_Surface, Deleter> operator()(const std::string &path) const {
return std::unique_ptr<SDL_Surface, Deleter>(
IMG_Load(path.c_str()),
Deleter());
}
};
Ожидаемый результат: класс окна должен создаваться без ошибок, как класс изображения
Фактический результат: класс окназавершается с ошибкой, указанной выше, в то время как класс Image строится нормально
Обновление : сужая дальше, перемещая логику создания shared_ptr в простую функцию, я обнаружил, что удаление пользовательского Deleter()
устраняет ошибку сборки,Так что, похоже, виновник.Но мне нужен Deleter, а также, почему тот же самый конструктор отлично работает с Image, используя unique_ptr.