12

我什至不知道该去哪里。谷歌不是很有帮助。和我之前的问题一样。我正在使用 TextMate 的 Command+R 来编译项目。

game.h:16:error: 'Player* HalfSet::Player() const'的声明</p>

player.h:11:error: 将 'Player' 的含义从 'class Player' 更改</p>

game.h:21:error: 'Player' 不是类型

player.h 文件(部分)

#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;
};

这里发生了什么?

4

4 回答 4

17

在 C++ 中,您不能将函数命名为与类/结构/类型定义相同的名称。您有一个名为“Player”的类,因此 HalfSet 类有一个名为“Player”的函数(“Player *Player()”)。您需要重命名其中之一(可能将 HalfSet 的 Player() 更改为 getPlayer() 或类似名称)。

于 2008-11-12T02:26:43.513 回答
10

您的问题是在范围内查找名称。在 的声明中,需要查找HalfSet::setPlayer(Player*)不合格的名称。Player尝试的第一个范围是class HalfSet. 在该范围内,查找Playerfind 函数HalfSet::Player,而不是global class ::Player.

解决方案是使用限定名称::Player. 这告诉编译器要使用哪个范围进行查找(全局),这反过来意味着HalfSet::Player甚至不考虑。

于 2008-11-12T09:57:06.083 回答
9

这个问题的当前答案是不正确的,它说:

在 C++ 中,您不能将函数命名为与类/结构/类型定义相同的名称

允许通过函数隐藏类的名称,如果我们去草案 Pre C++11 标准部分3.3.7 名称隐藏它说:

类名 (9.1) 或枚举名 (7.2) 可以被在同一范围内声明的对象、函数或枚举器的名称隐藏。如果一个类或枚举名称和一个对象、函数或枚举器在同一范围内(以任何顺序)以相同的名称声明,则无论对象、函数或枚举器名称可见,该类或枚举名称都会隐藏。

因此,您拥有该函数和一个名为的类这一Player事实不是问题,实际上以下代码是有效的:

class Player
{
} ;

Player* Player() ;

我们可以使用详细的类型说明符来取消隐藏类类型。

据我所知,这违反了3.3.6 Class scope段落2,它说:

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

因此,在这种情况下,Player将含义从class更改为function,我不清楚它的意图是如此严格,但我可以看到如何以这种方式阅读它。gcc正如我们从一个类似的问题中看到的那样,这似乎是它检测到这种违规时使用的消息。

使用详细的类型说明符可以防止含义的改变:

class Player* Player() const ;
于 2014-11-02T03:30:43.790 回答
0

我的代码出现此错误,我无法理解

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

但这就是我所做的,所以它解决了我的错误

以前的代码

#include "a.h"

class System {
 public:
  car car;    /*This line is problem, Can't declare object with same name as 
               class*/
};

修改后的代码

#include "a.h"

 class System {
  public:
   car Car;      //Here is the difference, Just changed first letter of object
  };
于 2022-02-21T03:15:20.227 回答