代码之家  ›  专栏  ›  技术社区  ›  epochwolf

C++奇数编译错误:从“对象”类中改变“对象”的意义

  •  8
  • epochwolf  · 技术社区  · 16 年前

    我都不知道该怎么办。谷歌帮不了什么忙。和我前面的问题一样。我正在使用TextMate的命令+R来编译这个项目。

    game.h:16:错误:声明玩家*半集::玩家()常量

    players.h:11:error:将“Player”的含义从“class Player”更改为“class Player”

    游戏。h:21:错误:玩家不是一种类型

    #ifndef PLAYERS_H
    #define PLAYERS_H
    using namespace std;
    
    #include <string>
    #include <vector>
    #include <istream>
    #include <iomanip>
    #include "generics.h"
    
    class Player{ //Line 11
    public:
        //getters
        long Id() const;
        string FirstName() const;
        string LastName() const;
        string Country() const;
        //setters
        void setId(long id);
        void setFirstName(string s);
        void setLastName(string s);
        void setCountry(string s);
        //serializing functions
        void display(ostream &out);
        void read(istream &in);
        void write(ostream &out);
        //Initalizers
        Player();
        Player(istream &in);
        Player(string firstName, string lastName);
        Player(string firstName, string lastName, string country);
        Player(long id, string firstName, string lastName, string country);
        ~Player();
    private:
        long _id;
        string _firstName;
        string _lastName;
        string _country;
    };
    

    game.h文件(部分)

    #ifndef GAME_H
    #define GAME_H
    
    #include "generics.h"
    #include "players.h"
    #include <string>
    #include <vector>
    #include <istream>
    #include <iomanip>
    
    using namespace std;
    
    class HalfSet{
    public:
        //getters
        Player* Player() const; //Line 16
        int GamesWon() const;
        int TotalPoints() const;
        int Errors() const;
        //setters
        void setPlayer(Player* p);
        void setGamesWon(int games);
        void setTotalPoints(int points);
        void setErrors(int errors);
        //Serialization
        void display(ostream &out) const;
        void read(istream &in) const;
        void write(ostream &out) const;
        //Initalizers
        HalfSet();
        ~HalfSet();
    private:
        Player* _player;
        int _gamesWon;
        int _points;
        int _errors;
    };
    

    这是怎么回事?

    3 回复  |  直到 4 年前
        1
  •  17
  •   SoapBox    16 年前

    在C++中,不能用一个函数命名一个类/Stult/Type。您有一个名为“Player”的类,因此HalfSet类有一个名为“Player”(“Player*Player()”)的函数。您需要重命名其中一个(可能会将HalfSet的Player()更改为getPlayer()或类似的名称)。

        2
  •  10
  •   Das_Geek Narendra Chennamsetti    4 年前

    您的问题是在作用域中查找名称。在 HalfSet::setPlayer(Player*) Player 需要查一下。第一个尝试的范围是 class HalfSet . 在该范围内,查找 游戏者 HalfSet::Player global class ::Player .

    解决方法是使用限定名称, ::Player 球员 甚至都没有考虑。

        3
  •  9
  •   Community omersem    7 年前

    在C++中,不能用与类/Stutt/Type的名称相同的名称命名函数。

    如果我们转到 draft Pre C++11 standard 部分 3.3.7 姓名隐藏 它说:

    在同一范围内声明的对象、函数或枚举数。如果 类或枚举名称以及对象、函数或枚举数 以相同的名称在相同的范围(以任何顺序)中声明 枚举器名称可见。

    事实上,你有一个函数和一个名为 Player 不是问题,事实上以下代码是有效的:

    class Player
    {
    } ;
    
    Player* Player() ;
    

    elaborated type specifier 取消隐藏类类型。

    据我所知,这违反了规定 3.3.6 类范围 2 上面说:

    类S中使用的名称N应在其名称中引用相同的声明 上下文以及在S.No.的完整范围内重新评估时 违反此规则需要进行诊断。

    所以在这种情况下 游戏者 作用 ,我不清楚它的用意如此严格,但我可以看出它是如何被这样解读的。这似乎就是信息 gcc similar question .

    class Player* Player() const ;