web-dev-qa-db-ja.com

エラー「C ++では、メソッドを定義する際にすべての宣言に型指定子が必要です」

私は比較的C++に慣れていないので(答えは簡単にしてください!)、エラーが発生する理由がわかりません:C++ requires a type specifier for all declarations whilst defining methods.

テキストファイルを1行ずつ読み取り、値を配列に格納する単純なプログラムを作成しようとしています。ただし、.cppファイルでメソッドを宣言しようとすると問題が発生します。以下のコードを見つけてください。

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
}

私は役に立たなかったが、C++の適切なドキュメントの読み方がまだよくわからないので、少し立ち往生している。これまでに3つまたは4つの(単純な)オブジェクト指向プログラムを作成しましたが、この問題は一度もありません。 Xcodeを使用しているのに役立ちますが、Eclipseでも同じエラーが発生します。

戻り値の型、名前、headファイルで定義されたパラメーターに関係なく、どのメソッドでもこのエラーが発生しますが、コンストラクターは問題ありません。 PrintWords()が削除された場合、プロジェクトは正常にビルドされます。

どんなポインターでも大歓迎です!

16
Lorienas

voidとして宣言しましたが、定義に入れるのを忘れました。する必要があります:

void StringList::PrintWords()

23
stellarossa

メンバー関数PrintWordsは次のようにプロトタイプ化されます:

void PrintOn();

つまり、voidを返します。他の場所で関数を実装する場合、誤って除外した戻り値の型を提供する必要があります。

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

問題のある行の前にvoidを付けます。

冗長に感じても、宣言と実装の両方で戻り値の型を指定する必要があります。

3