Screen.h
#ifndef SCREEN_H
#define SCREEN_H
#include <SFML/Graphics.hpp>
class Screen
{
public:
virtual void handleInput(sf::RenderWindow& window) = 0;
virtual void update(sf::Time delta) = 0;
virtual void render(sf::RenderWindow& window) = 0;
};
#endif
Game.h
#ifndef GAME_H
#define GAME_H
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <vector>
#include <memory>
#include "Screen.h"
namespace sfSnake
{
class Game
{
public:
Game();
void run();
void handleInput();
void update(sf::Time delta);
void render();
static const int Width = 640;
static const int Height = 480;
static std::shared_ptr<Screen> Screen;
private:
sf::RenderWindow window_;
sf::Music bgMusic_;
static const sf::Time TimePerFrame;
};
}
#endif
我对这两个标题有问题。该代码与visual studio编译良好,但不适用于GCC。
我收到了错误:
Description Resource Path Location Type
error: changes meaning of ”Screen” from ”class Screen” [-fpermissive] Screen.h /Snake line 6 C/C++ Problem
error: declaration of ”std::shared_ptr<Screen> sfSnake::Game::Screen” [-fpermissive] Game.h /Snake line 28 C/C++ Problem
我已经看了一会儿,但还没有找到解决方案。我真的感到失落...... 这也不是我的代码,它是由用户'jh1997sa'在reddit上编写的。 The source on github. His thread on reddit.
答案 0 :(得分:1)
你还没有命名你的平台,但我认为这是运行X11的Linux的一些风格。如果是这样,这很可能与X11 / Xlib.h中定义的Screen结构名称冲突。 SFML几乎肯定会在幕后使用Xlib与windowng系统进行交互。
因为Xlib是一个C库,所以它定义的所有符号都存在于全局命名空间中。幸运的是,在C ++中,您可以选择将Screen类放在您选择的命名空间中。只要您通过其完全限定名称引用它,就可以避免名称冲突。
答案 1 :(得分:0)
据我所知,如果你想在linux系统上编译,你应该使用g ++编译而不是gcc。