我甚至不知道该去哪里.谷歌不是很有帮助.和我之前的问题一样.我正在使用TextMate的Command + R来编译项目.
game.h:16:错误:'Player*HalfSet :: Player()const'的声明
players.h:11:错误:从'class Player'改变'Player'的含义
game.h:21:错误:'播放器'不是一种类型
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;
};
Run Code Online (Sandbox Code Playgroud)
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;
};
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
Soa*_*Box 16
在C++中,您不能将函数命名为类/ struct/typedef.你有一个名为"Player"的类,所以HalfSet类有一个名为"Player"("Player*Player()")的函数.您需要重命名其中一个(可能将HalfSet的Player()更改为getPlayer()或其他).
您的问题是在范围中查找名称.在HalfSet :: setPlayer(Player*)的声明中,需要查找非限定名称Player.尝试的第一个范围是类HalfSet.在该范围内,Player的查找找到函数HalfSet :: Player,而不是全局类:: Player.
解决方案是使用限定名称:: Player.这告诉编译器哪个范围用于查找(全局),这反过来意味着甚至不考虑HalfSet :: Player.
目前对这个问题的回答是不正确的,它说:
在C++中,您不能将函数命名为类/ struct/typedef
允许使用函数隐藏类的名称,如果我们转到草案Pre C++ 11标准部分3.3.7
名称隐藏它说:
类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的对象,函数或枚举器的名称隐藏.如果类或枚举名称以及对象,函数或枚举器在具有相同名称的同一作用域(按任何顺序)中声明,则在对象,函数或枚举器名称可见的任何位置都会隐藏类或枚举名称.
所以你有这个函数和一个名为class的Player
事实不是问题,实际上下面的代码是有效的:
class Player
{
} ;
Player* Player() ;
Run Code Online (Sandbox Code Playgroud)
我们可以使用精心设计的类型说明符来取消隐藏类类型.
据我所知,这违反了章节3.3.6
范围段落2
,其中说:
在类S中使用的名称N应在其上下文中引用相同的声明,并在完成的S范围内重新评估.违反此规则不需要诊断.
所以在这种情况下Player
改变了从类到函数的含义,我不清楚它是如此严格,但我可以看到它是如何以这种方式读取的.这似乎是在gcc
检测到此违规时使用的消息,我们可以从类似的问题中看到.
使用精心设计的类型说明符可以防止意义的改变:
class Player* Player() const ;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14733 次 |
最近记录: |