Visual Studio 2017 C2027使用未定义类型' SDL_Texture'

时间:2018-03-07 17:51:48

标签: c++ visual-studio-2017 sdl-2

我从将gcc中的代码编译到Visual Studio 2017提供的编译器。

每次我尝试运行应用程序时都会出现以下错误:

enter image description here

以下是我认为错误来自的文件:

  

Texture.h

#include <SDL2/SDL.h>
#include <memory>
#include <string>
namespace AcsGameEngine {

class Renderer;

class Texture {
public:
    Texture(const Renderer& renderer);
    Texture(const Renderer& renderer, const std::string&);
    Texture(const Texture& orig) = default;
    virtual ~Texture();

    void load(const std::string&, uint16_t w = 0, uint16_t h = 0) const;
    void load(const char*, uint16_t w = 0, uint16_t h = 0);

    const Renderer& getRenderer() const { return m_renderer; }

    //inline SDL_Texture* getRawPointer() const { return m_texture->get(); }

private:
    std::unique_ptr<SDL_Texture> m_texture;
    const Renderer& m_renderer;

    uint16_t m_width;
    uint16_t m_height;
};
} // namespace AcsGameEngine
  

Texture.cpp

#include "Texture.h"
#include "Renderer.h"
#include <SDL2/SDL_image.h>

namespace AcsGameEngine {

    Texture::Texture(const Renderer &renderer) : m_renderer(renderer) {
    }

    Texture::Texture(const Renderer &renderer, const std::string &p) : Texture(renderer) {
        load(p.c_str());
    }

    Texture::~Texture() {
        if (m_texture != nullptr) {
            SDL_DestroyTexture(m_texture.get());
        }
    }

    void Texture::load(const std::string &path, uint16_t w, uint16_t h) const {
        load(path.c_str());
    }

    void Texture::load(const char *path, uint16_t w, uint16_t h) {
        SDL_Surface *tmp = IMG_Load(path);
        m_texture.reset(SDL_CreateTextureFromSurface(m_renderer.getRawPointer(), tmp));
        SDL_FreeSurface(tmp);

        if (m_texture == false) {
            //error
        }

    }

} // namespace AcsGameEngine

我不明白为什么抱怨未定义的类型,因为SDL.h包含struct SDL_Texture。

2 个答案:

答案 0 :(得分:3)

SDL.h不包含SDL_Texture的定义。它只包含一个前向声明。这是因为你从不打算直接使用这个类型,你只是想用它来指向它。但是,为了实例化std::unique_ptr<SDL_Texture>,您需要完整的定义。

但是为什么你在这里没有使用自定义删除器std::unique_ptr,因为你只需要用SDL_DestroyTexture手动删除对象?这违背了使用智能指针的全部目的。试试这个:

struct TextureDeleter
{
    void operator()(SDL_Texture* tp) {
        SDL_DestroyTexture(tp);
    }
};

std::unique_ptr<SDL_Texture, TextureDeleter> m_texture;

答案 1 :(得分:3)

在SDL.h中未声明

SDL_Texture结构。它是一个内部类型,只有它的前向声明在公共接口中可用,你不能delete它。您应该为智能指针std::unique_ptr<SDL_Texture, void(SDL_Texture*)> m_texture提供自定义删除器,然后再分配m_texture = std::unique_ptr(SDL_CreateTextureFromSurface(...), SDL_DestroyTexture)