C++ C++;奇数编译错误:错误:更改“的含义”;“对象”;“来自课堂”;“对象”;

C++ C++;奇数编译错误:错误:更改“的含义”;“对象”;“来自课堂”;“对象”;,c++,xcode,C++,Xcode,我都不知道该怎么办。谷歌帮不了什么忙。和我前面的问题一样。我正在使用TextMate的命令+R来编译这个项目 game.h:16:错误:“Player*HalfSet::Player()const”的声明 玩家。h:11:错误:将“玩家”的含义从“职业玩家”更改为“职业玩家” 游戏h:21:错误:“玩家”不是一种类型 player.h文件(部分) \ifndef玩家\u H #定义玩家 使用名称空间std; #包括 #包括 #包括 #包括 #包括“generics.h” 类播放器{//第11行

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

game.h:16:错误:“Player*HalfSet::Player()const”的声明

玩家。h:11:错误:将“玩家”的含义从“职业玩家”更改为“职业玩家”

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

player.h文件(部分)

\ifndef玩家\u H
#定义玩家
使用名称空间std;
#包括
#包括
#包括
#包括
#包括“generics.h”
类播放器{//第11行
公众:
//吸气剂
长Id()常量;
字符串FirstName()常量;
字符串LastName()常量;
字符串Country()常量;
//二传手
void setId(长id);
void setFirstName(字符串s);
void setLastName(字符串s);
无效设置国家(字符串s);
//序列化函数
无效显示(ostream&out);
无效读取(istream&in);
无效写入(ostream&out);
//初始化器
Player();
玩家(istream&in);
播放器(字符串名、字符串名);
播放器(字符串名、字符串名、字符串国家);
播放器(长id、字符串名、字符串名、字符串国家);
~Player();
私人:
长id;
字符串_firstName;
字符串_lastName;
字符串(u)国家;;
};
game.h文件(部分)

\ifndef游戏
#定义游戏
#包括“generics.h”
#包括“players.h”
#包括
#包括
#包括
#包括
使用名称空间std;
类半集{
公众:
//吸气剂
Player*Player()常量;//第16行
int GamesWon()常量;
int TotalPoints()常量;
int Errors()常量;
//二传手
无效设置玩家(玩家*p);
void setGamesWon(智力游戏);
无效设定点(整数点);
无效设置错误(整数错误);
//系列化
无效显示(ostream&out)常数;
无效读取(istream&in)常量;
无效写入(ostream&out)常数;
//初始化器
半集();
~HalfSet();
私人:
玩家*\u玩家;
国际gamesWon;
积分;
int_错误;
};

<>这里发生了什么?C++中的< /p> ,不能用一个函数来命名一个函数类/Stult/Type。您有一个名为“Player”的类,因此HalfSet类有一个名为“Player”(“Player*Player()”)的函数。您需要重命名其中一个(可能将HalfSet的Player()更改为getPlayer()或类似的名称)。

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


解决方案是使用限定名称,
::Player
。这会告诉编译器用于查找(全局)的范围,这意味着甚至不考虑
HalfSet::Player

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


<>在C++中,你不能用一个函数来命名一个类/Stult/Type 如果我们转到
3.3.7
Name hidden一节,则允许通过函数隐藏类的名称,该节指出:

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

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

class Player
{
} ;

Player* Player() ;
我们可以使用一个函数来取消隐藏类类型

据我所知,这违反了第
3.3.6节
类范围段落
2
,其中规定:

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

所以在这个例子中,
Player
将含义从类更改为函数,我不清楚它的意图是如此严格,但我可以看到它是如何以这种方式读取的。这似乎是
gcc
在检测到此违规行为时使用的消息,我们可以从

使用精心设计的类型说明符可防止含义的变化:

class Player* Player() const ;

可以,但不是成员函数。对第16行执行::Player*Player()可以解决此问题。不幸的是,VisualC++编译器允许你这样做,所以如果你尝试用G++的东西在Windows上编译,你会得到一个令人讨厌的惊喜。
class Player
{
} ;

Player* Player() ;
class Player* Player() const ;