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