2008-11-12 3 views
8

Ich weiß nicht einmal, wohin damit zu gehen. Google war nicht sehr hilfreich. Wie bei meiner vorherigen Frage. Ich verwende TextMate Command + R, um das Projekt zu kompilieren.C++ ungerade Kompilierfehler: Fehler: ändert die Bedeutung von "Objekt" aus der Klasse "Objekt"

game.h:16:error: declaration of ‘Player* HalfSet::Player() const’

players.h:11:error: changes meaning of ‘Player’ from ‘class Player’

game.h:21:error: ‘Player’ is not a type

player.h Datei (teilweise)

#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 Datei (teilweise)

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

Was ist hier los?

+0

Die aktuelle akzeptierte Antwort auf diese Frage ist einfach falsch, wie ich in meiner Antwort erklären. –

Antwort

14

In C++ können Sie eine Funktion nicht den gleichen Namen wie eine Klasse/struct/typedef nennen. Sie haben eine Klasse namens "Player" und daher hat die HalfSet-Klasse eine Funktion namens "Player" ("Player * Player()"). Sie müssen einen von ihnen umbenennen (wahrscheinlich den Player von HalfSet ändern() zu getPlayer() oder so).

+0

Danke, mein Projekt kompiliert jetzt komplett. – epochwolf

+2

Nun - Sie können, aber keine Mitgliedfunktion. –

+2

Doing :: Player * Player() für Zeile 16 würde dieses Problem beheben. (wie vorgeschlagen b @ MSalters) – Urkle

8

Ihr Problem ist, dass Namen in Bereichen nachgeschlagen werden. Innerhalb der Deklaration von HalfSet :: setPlayer (Player *) muss der unqualifizierte Name Player nachgeschlagen werden. Der erste getestete Bereich ist die Klasse HalfSet. In diesem Bereich findet das Nachschlagen von Player die Funktion HalfSet :: Player, nicht global class :: Player.

Die Lösung besteht darin, einen qualifizierten Namen zu verwenden, :: Player. Dies sagt dem Compiler, welcher Bereich für die Suche (global) verwendet werden soll, was wiederum bedeutet, dass HalfSet :: Player nicht einmal berücksichtigt wird.

5

Die aktuelle Antwort auf diese Frage nur falsch ist, sagt es:

In C++ you cannot name a function the same name as a class/struct/typedef

Namen Versteck einer Klasse durch eine Funktion erlaubt ist, wenn wir in den draft Pre C++11 standard Abschnitt 3.3.7Namen es versteckt gehen, sagt:

A class name (9.1) or enumeration name (7.2) can be hidden by the name of an object, function, or enumerator declared in the same scope. If a class or enumeration name and an object, function, or enumerator are declared in the same scope (in any order) with the same name, the class or enumeration name is hidden wherever the object, function, or enumerator name is visible.

die Tatsache, dass Sie die Funktion und eine Klasse mit dem Namen haben Player nicht das Problem ist, ist der folgende Code in der Tat gültig:

class Player 
{ 
} ; 

Player* Player() ; 

und wir können eine elaborated type specifier verwenden, um den Klassentyp zu verbergen.

Soweit ich das sagen kann, Abschnitt 3.3.6Klasse Anwendungsbereich Absatz 2 verletzt, die sagt:

A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.

in diesem Fall also Player von Klasse bedeuten Änderungen zu einer Funktion, es ist Nicht klar für mich war es so streng gemeint, aber ich kann sehen, wie es so gelesen werden könnte. Dies scheint die Nachricht zu sein, die gcc verwendet, wenn sie diese Verletzung feststellt, wie wir von einem similar question sehen können.

ausgearbeitete Typspezifikation wird verhindert, dass die Änderung von Bedeutung:

class Player* Player() const ;