Hoe C++-fout op te lossen: verwachte niet-gekwalificeerde id

Ik krijg deze foutmelding op regel 6:

error: expected unqualified-id before '{' token

Ik weet niet wat er aan de hand is.

#include <iostream>
using namespace std;
class WordGame;
{               // <== error is here on line 6
public:
    void setWord( string word )
    {
        theWord = word;
    }
    string getWord()
    {
        return theWord;
    }
    void displayWord()
    {
        cout << "Your word is " << getWord() << endl;
    }
private:
    string theWord;
}
int main()
{
    string aWord;
    WordGame theGame;
    cin >> aWord;
    theGame.setWord(aWord);
    theGame.displaymessage();
}

Antwoord 1, autoriteit 100%

Hier mag geen puntkomma staan:

class WordGame;

…maar er zou er een moeten staan aan het einde van je klasdefinitie:

...
private:
    string theWord;
}; // <-- Semicolon should be at the end of your class definition

Antwoord 2, autoriteit 27%

Overweeg terzijde om strings in setWord() door te geven als const-referenties om overmatig kopiëren te voorkomen. Overweeg ook om in displayWord dit een const-functie te maken om const-correctheid te volgen.

void setWord(const std::string& word) {
  theWord = word;
}

Antwoord 3, autoriteit 18%

Verwijder de puntkomma na WordGame.

Je had dit probleem echt moeten ontdekken toen de klas een stuk kleiner was. Als je code schrijft, zou je ongeveer elke keer dat je een half dozijn regels toevoegt, moeten compileren.


Antwoord 4, autoriteit 9%

Een puntkomma moet aan het einde van de klassedefinitie staan in plaats van na de naam:

class WordGame
{
};

Antwoord 5

Voor wat het waard is, ik had hetzelfde probleem, maar het was niet vanwege een extrapuntkomma, het was omdat ik een puntkomma was vergeten in de vorige verklaring.

Mijn situatie was zoiets als

mynamespace::MyObject otherObject
for (const auto& element: otherObject.myVector) {
  // execute arbitrary code on element
  //...
  //...
} 

Van deze code vertelde mijn compiler me steeds:

error: expected unqualified-id before for (const auto& element: otherObject.myVector) {
etc...

waarvan ik had aangenomen dat ik de for-lus verkeerd had geschreven. Nee! Ik was gewoon een ;vergeten na het aangeven van otherObject.


Antwoord 6

Voor iedereen met deze situatie: ik zag deze fout toen ik per ongeluk my_first_scope::my_second_scope::truegebruikte in plaats van gewoon true, zoals dit:

bool my_var = my_first_scope::my_second_scope::true;

in plaats van:

bool my_var = true;

Dit komt omdat ik een macro had die ervoor zorgde dat MY_MACRO(true)per ongeluk uitbreidde naar my_first_scope::my_second_scope::true, en ik belde eigenlijk bool my_var = MY_MACRO(true);.

Hier is een korte demo van dit type scopingfout:

Programma (u kunt het hier online uitvoeren: https://onlinegdb.com/BkhFBoqUw):

#include <iostream>
#include <cstdio>
namespace my_first_scope 
{
namespace my_second_scope
{
} // namespace my_second_scope
} // namespace my_first_scope
int main()
{
    printf("Hello World\n");
    bool my_var = my_first_scope::my_second_scope::true;
    std::cout << my_var << std::endl;
    return 0;
}

Uitvoer (bouwfout):

main.cpp: In function ‘int main()’:
main.cpp:27:52: error: expected unqualified-id before ‘true’
     bool my_var = my_first_scope::my_second_scope::true;
                                                    ^~~~

Let op de fout: error: expected unqualified-id before ‘true’, en waar de pijl onder de fout naar wijst. Blijkbaar is de “unqualified-id”in mijn geval de dubbele dubbele punt (::) scope-operator die ik heb net voor true.

Als ik de macro toevoeg en gebruik (voer deze nieuwe code hier uit: https://onlinegdb.com/H1eevs58D ):

#define MY_MACRO(input) my_first_scope::my_second_scope::input
...
bool my_var = MY_MACRO(true);

In plaats daarvan krijg ik deze nieuwe fout:

main.cpp: In function ‘int main()’:
main.cpp:29:28: error: expected unqualified-id before ‘true’
     bool my_var = MY_MACRO(true);
                            ^
main.cpp:16:58: note: in definition of macro ‘MY_MACRO’
 #define MY_MACRO(input) my_first_scope::my_second_scope::input
                                                          ^~~~~

Other episodes