使用GCC编译游戏时出错。 (错误:从“类屏幕”更改“屏幕”的含义[-fpermissive])

时间:2014-05-01 00:48:26

标签: c++ gcc compiler-errors eclipse-cdt sfml

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.

2 个答案:

答案 0 :(得分:1)

你还没有命名你的平台,但我认为这是运行X11的Linux的一些风格。如果是这样,这很可能与X11 / Xlib.h中定义的Screen结构名称冲突。 SFML几乎肯定会在幕后使用Xlib与windowng系统进行交互。

因为Xlib是一个C库,所以它定义的所有符号都存在于全局命名空间中。幸运的是,在C ++中,您可以选择将Screen类放在您选择的命名空间中。只要您通过其完全限定名称引用它,就可以避免名称冲突。

答案 1 :(得分:0)

据我所知,如果你想在linux系统上编译,你应该使用g ++编译而不是gcc。