【问题标题】:C++ odd compile error: error: changes meaning of "Object" from class "Object"C++ 奇怪的编译错误:错误:从类“对象”更改“对象”的含义
【发布时间】:2008-11-12 02:13:50
【问题描述】:

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

game.h:16:error: ‘Player* HalfSet::Player() const’的声明

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

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

这是怎么回事?

【问题讨论】:

  • 当前接受的这个问题的答案是不正确的,正如我在回答中解释的那样。

标签: c++ xcode


【解决方案1】:

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

【讨论】:

  • 嗯 - 你可以,但不是成员函数。
  • 对第 16 行执行 ::Player *Player() 将解决此问题。 (正如@MSalters 建议的那样)
  • 不幸的是,Visual C++ 编译器允许你这样做,所以当你尝试用 g++ 编译在 windows 上工作的东西时,你会感到非常惊讶。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    允许通过函数隐藏类的名称,如果我们转到 draft Pre C++11 standard 部分 3.3.7 名称隐藏,它会说:

    类名 (9.1) 或枚举名 (7.2) 可以通过名称隐藏 在同一作用域中声明的对象、函数或枚举器。如果一个 类或枚举名称和对象、函数或枚举数是 在相同范围内(以任何顺序)以相同的名称声明, 类或枚举名称隐藏在对象、函数或 枚举器名称可见。

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

    class Player
    {
    } ;
    
    Player* Player() ;
    

    我们可以使用elaborated type specifier 来取消隐藏类类型。

    据我所知,这违反了3.3.6 部分 类范围 段落2,它说:

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

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

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

    class Player* Player() const ;
    

    【讨论】:

      【解决方案4】:

      我的代码出现了这个错误,我无法理解

      在类 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
        };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 1970-01-01
        • 2021-07-24
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多