web-dev-qa-db-fra.com

Erreur "C ++ nécessite un spécificateur de type pour toutes les déclarations lors de la définition des méthodes"

Je suis relativement nouveau en C++ (alors essayez de garder les réponses simples s'il vous plaît!), Et je ne comprends pas pourquoi j'obtiens l'erreur: C++ requires a type specifier for all declarations whilst defining methods.

J'essaie d'écrire un programme simple pour lire un fichier texte ligne par ligne, stocker les valeurs dans un tableau. Cependant, je rencontre un problème lorsque j'essaie de déclarer des méthodes dans mon fichier .cpp. Veuillez trouver le code ci-dessous.

StringList.h

#ifndef StringListH
#define StringListH

#include <vector>
#include <string>

class StringList {
public:
     StringList();
     ~StringList();
     void PrintWords();
private:
     size_t numberOfLines;
     std::vector<std::string> str;
};

#endif

StringList.cpp

#include "StringList.h"
#include <fstream>
#include <istream>
#include <algorithm> // std::copy
#include <iterator>  // istream_iterator

using namespace std;

StringList::StringList()
{
    ifstream myfile("input.in");
    if (myfile.is_open())
    {
        copy(
            istream_iterator<string>(myfile),
            istream_iterator<string>(),
            back_inserter(str));
    }
    numberOfLines = str.size();
}

StringList::~StringList(){
    //Deconstructor
}

// Error Happens Here
StringList::PrintWords(){
    //Print My array
}

J'ai googlé en vain, je ne comprends pas encore comment lire la documentation appropriée pour C++, donc je suis un peu coincé. Jusqu'à présent, j'ai écrit environ 3 ou 4 programmes (simples) orientés objet et je n'ai jamais eu ce problème. Si cela aide, j'utilise Xcode, mais j'obtiens la même erreur dans Eclipse.

Il semble que n'importe quelle méthode, indépendamment du type de retour, du nom et des paramètres définis dans mon fichier principal, donne cette erreur - mais le constructeur va bien. Si PrintWords () est supprimé, le projet se construit très bien.

Tous les pointeurs seront très appréciés!

16
Lorienas

vous l'avez déclaré comme void mais vous avez oublié de le mettre dans la définition. devrait être:

void StringList::PrintWords()

23
stellarossa

Votre fonction membre PrintWords est prototypée comme:

void PrintOn();

Cela signifie qu'il renvoie void. Lorsque vous implémentez votre fonction ailleurs, vous devez toujours fournir le type de retour, que vous avez par erreur omis:

/* void */ StringList::PrintOn() { ... }
4
0x499602D2

Mettez un void devant la ligne vous donnant des problèmes.

Même s'il semble redondant, vous devez spécifier le type de retour à la fois dans la déclaration et l'implémentation.

3