c++;-‘;X’;未在此作用域中声明:一个自定义类已识别,但另一个未识别 我试图学习C++,并遇到了编译错误,我无法确定如何修复。我确信这是我错过的一些简单的事情,但我根本无法解决它 Display.cpp:21:17: error: ‘Renderer’ was not declared in this scope std::shared_ptr<Renderer> Display::CreateRenderer(std::shared_ptr<Window> windo ^ Display.cpp:21:17:错误:未在此范围内声明“渲染器” std::shared_ptr Display::CreateRenderer(std::shared_ptr windo ^

c++;-‘;X’;未在此作用域中声明:一个自定义类已识别,但另一个未识别 我试图学习C++,并遇到了编译错误,我无法确定如何修复。我确信这是我错过的一些简单的事情,但我根本无法解决它 Display.cpp:21:17: error: ‘Renderer’ was not declared in this scope std::shared_ptr<Renderer> Display::CreateRenderer(std::shared_ptr<Window> windo ^ Display.cpp:21:17:错误:未在此范围内声明“渲染器” std::shared_ptr Display::CreateRenderer(std::shared_ptr windo ^,c++,c++11,include,header-files,C++,C++11,Include,Header Files,Renderer.h文件包含在Display.h文件中,因此据我所知,它应该将其提取出来(不需要像#include in effect?)那样进行前向声明。我尝试提供完整的名称空间,但没有效果。让我困惑的是,我包含的另一个文件(Window.h)工作正常,如果我删除GetRenderer()函数,它编译时不会出错。窗口和Renderer类之间唯一的真正区别是Renderer包含了另一个类(纹理),但据我所知,没有循环依赖关系 以下是涉及的文件: 显示.h #include <SDL2/SD

Renderer.h文件包含在Display.h文件中,因此据我所知,它应该将其提取出来(不需要像#include in effect?)那样进行前向声明。我尝试提供完整的名称空间,但没有效果。让我困惑的是,我包含的另一个文件(Window.h)工作正常,如果我删除GetRenderer()函数,它编译时不会出错。窗口和Renderer类之间唯一的真正区别是Renderer包含了另一个类(纹理),但据我所知,没有循环依赖关系

以下是涉及的文件:

显示.h

#include <SDL2/SDL.h>
#include <iostream>
#include <memory>
#include "Window.h"
#include "Renderer.h"

#ifndef DISPLAY_H
#define DISPLAY_H

namespace MapTool {
    namespace Display {
        class Display {
        public:
            Display();
            ~Display();

            std::shared_ptr<Window> CreateWindow(std::string title, 
                                                 int openX, int openY,
                                                 int width, int height);
            std::shared_ptr<Renderer> CreateRenderer(std::shared_ptr<Window> window);

        private:
        };
    }
}

#endif
#包括
#包括
#包括
#包括“Window.h”
#包括“Renderer.h”
#ifndef显示器
#定义显示
名称空间映射工具{
名称空间显示{
课堂展示{
公众:
显示();
~Display();
std::shared_ptr CreateWindow(std::字符串标题,
int-openX,int-openY,
整数宽度,整数高度);
std::shared_ptr CreateRenderer(std::shared_ptr窗口);
私人:
};
}
}
#恩迪夫
Display.cpp

#include "Display.h"

using namespace MapTool::Display;

Display::Display() {
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        std::cerr << "SDL Initialisation failed " << SDL_GetError() << std::endl;
    }
}

Display::~Display() {
    SDL_Quit();
}

std::shared_ptr<Window> Display::CreateWindow(std::string title, 
                                          int openX, int openY,
                                          int width, int height) {
    return std::shared_ptr<Window>(new Window(title, openX, openY, width, height));
}

std::shared_ptr<Renderer> Display::CreateRenderer(std::shared_ptr<Window> window) {
    return std::shared_ptr<Renderer>(new Renderer(window->GetWindow()));
}
#包括“Display.h”
使用名称空间映射工具::显示;
Display::Display(){
if(SDL_Init(SDL_Init_视频)<0){

std::cerr能否显示Renderer.h文件的相关部分,包括其所有
#includes
?顺便说一句,
#includes
通常应位于
#ifndef
包含保护内。我已经编辑了上面的内容以包含它们。:)是否还应添加纹理类代码?
#include <SDL2/SDL.h>
#include <iostream>
#include <memory>

#include "Texture.h"

#ifndef RENDERER_H
#define RENDERER_H

namespace MapTool {
    namespace Display {
        class Renderer {
        public:
            Renderer(SDL_Window *window);
            ~Renderer();

            SDL_Renderer *GetRenderer();

            void Clear();
            void Copy(std::shared_ptr<Texture> texture);
            void Present();

        private:
            SDL_Renderer *renderer;
        };
    }
}

#endif
#include "Renderer.h"

using namespace MapTool::Display;

Renderer::Renderer(SDL_Window *window) {
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if (renderer == NULL) {
        std::cerr << "Failed to create renderer " << SDL_GetError() << std::endl;
    } else {
        SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
    }
}

Renderer::~Renderer() {
    SDL_DestroyRenderer(renderer);
}

[...]