0

redefiniton of 'reader' with a different typefstream オブジェクトを main() から別のクラスのコンストラクターに渡して読み取ろうとすると、コンパイラーが文句を言うのはなぜですか? これはおそらく私がそれを行う愚かな方法であることを認識しています。実際には、ファイル名を要求するパラメーターとして文字列を使用し、それをクラスのコンストラクターで割り当てる fstream に渡す必要があります。しかし、とにかく、なぜこれが機能しないのか疑問に思っています。コンパイラの警告は不可解です。

私の主な機能:

fstream reader;
reader.open("read.txt");
Markov(reader);

Markov.h クラスのコンストラクター:

class Markov {
public:
/** Constructor */
    Markov(fstream inStream) {
    Map<string, Vector<string> > array0;

    char ch;
    while (inStream.good())
    {
        ch = inStream.get();
        cout << ch << endl;
    }
    cout << "End: " << ch;

    order0(array0);
}
4

2 に答える 2

4

この行は、タイプMarkov(reader);という名前の変数を作成しています。次と同等です。もちろん、コンパイラは という別の変数を宣言していると判断するため、このエラーがスローされます。のインスタンスを作成するには、次のようにします。readerMarkovMarkov reader;readerMarkov

Markov m(reader);

これは、C++ の文法のあいまいさであり、一時変数の構築ではなく、常に変数の宣言と見なされます。実際、宣言の変数名の周りに好きなだけ括弧を付けることができます: Markov (((((reader))))).

Markov(reader)Markovもちろん、宣言として解析できるステートメントに含まれていない限り、type の一時を作成するための完全に優れた構文です。例えば、表情の途中なら大丈夫です。工夫された式something += Markov(reader) - 6では、宣言として解釈することはできません。

同様に、コンストラクターに複数の引数が渡されるMarkov(reader, writer)場合、または単一の引数が識別子でない場合、Markov("foo")あいまいではありません。

C++11 コンパイラを使用している場合は、新しい初期化構文を使用して単一の引数識別子を取る一時的なものを実際に作成できます (そうする理由はわかりませんが)。

Markov{reader};
于 2012-11-16T17:35:37.927 に答える
2

参照fstreamによってそれを渡したいと思うかもしれません。

Markov(fstream& inStream)

入力サービスにのみ使用している場合は、ifstream&代わりに an を使用してください。

于 2012-11-16T17:37:40.807 に答える