5

皆さんに助けを求める前に、これを調査するのに 1 時間以上を費やしました。Visual Studio 2012 を使用しており、アップデート 2 をインストールしました。

私はこのコンストラクタを持っています

Lexer::Lexer(istream &source1, ostream& listing1)
:source(source1), listing(listing1)
{
vector<string> tempVec = { 
    "and", "begin", "boolean", "break", "call", "end", "else", "false", "halt",
        "if", "input", "integer", "is", "loop", "not", "null", "newline", "or", "output", "procedure"
        "return", "then", "true", "var"
};




tokenToStringVector = tempVec;

for (int k= 0; k < tokenToStringVector.size(); k++)
{
    string key = tokenToStringVector[k];
    lexemeToTokenMap[key] = Token(k); // Function-style type cast
}
}

私の教授がヘッダーを書き、私がコードを書きました。私は理解できないこのエラーが発生しています:

1>c:\users\sam\dropbox\compiler project\lexical analyzer\lexer.cpp(8): error C2552: 'tempVec' : non-aggregates cannot be initialized with initializer list
1>          'std::vector<_Ty>' : Types with a base are not aggregate
1>          with
1>          [
1>              _Ty=std::string
1>          ]

このように初期化できない理由がわかりません。配列を作成してからループをベクターに追加することもできますが、既にベクターを使用してマップを作成しているだけなので、これを行うにはもっと論理的な方法が必要です。

ありがとうございます!みなさま、いつも大変お世話になっております!

注意してください: 答えが単純なフォーマット エラーでない場合は、コードを修正せずに、正しい方向に向けてください。これは段階的な課題であり、私は正直な学生であり、自分で学びたいと思っています。


OK、返信と、誰かが投稿したSO投稿を再読することから。

  1. C++ 2011 では有効ですが、Visual Studio ではこれをサポートしていません。

みんなありがとう、私は配列を作成する必要があると思います。

私の教授は、これと同じようにするように私に言いました。彼はこれをサポートする Linux gcc コンパイラを使用しています。

編集: わかりました。Microsoft には、これをサポートするアルファ版があります。配列を作成して転送するだけだと思います。

助けてくれてありがとう!!!!

4

5 に答える 5

1

あなたのコードは有効な C++11 ですが、ツールチェーンはこれに満足していないようです (ちなみに、私のものは Apple LLVM 4.2 Clang です)。これを代替手段として検討してください:

Lexer::Lexer(istream &source1, ostream& listing1)
    :source(source1), listing(listing1)
{
    static const char *reserved[] =
    {
        "and", "begin", "boolean", "break", "call",
        "end", "else", "false", "halt", "if", "input",
        "integer", "is", "loop", "not", "null", "newline",
        "or", "output", "procedure", "return", "then",
        "true", "var"
    };

    std::copy(std::begin(reserved), std::end(reserved),
              back_inserter(tokenToStringVector));

    // rest of your code.
}

,注: マージされた "procedure" と "return" の文字列を自由に修正しました。これは、偶然に分離するのを怠ったと確信しています。

于 2013-04-18T16:17:15.537 に答える