3

これが Visual Studio で正常にコンパイルおよび実行されることから始めましょう。しかし、Linux (g++) で同じファイルをコンパイルすると、<<演算子のオーバーロードの宣言と実装でコンパイル エラーが発生します。

コードの関連部分を以下に抜粋します。(これは、Google テスト ケースを含む .cpp ファイルであり、テスト ケースをサポートするためにクラスとメソッドの定義が散りばめられています。) コードの関連部分以外はすべて省略しました (希望します)。

class orderrequest : public msg_adapter {
public:
    // ... snip

    friend bool operator ==(const orderrequest &or1, const orderrequest &or2);
    friend ostream& operator <<(ostream &out, const orderrequest &or);  // compiler error here
};

bool operator ==(const orderrequest &or1, const orderrequest &or2) {
    bool result = or1.symbol == or2.symbol
        && or1.orderQty == or2.orderQty;

    // ...  snip
    return result;

}

// compiler error here
ostream& operator <<(ostream &out, const orderrequest &or) {

    out << "symbol=" << or.symbol << ",orderQty=" << or.orderQty;
    return out;
}

<<コンパイルでいくつかのエラーがスローされますが、これらはすべて、オペレーターをオーバーロードしようとしたことに関連しているようです。

EZXMsgTest.cpp:400: error: expected ',' or '...' before '||' token
EZXMsgTest.cpp:428: error: expected ',' or '...' before '||' token
EZXMsgTest.cpp: In function 'std::ostream& operator<<(std::ostream&, const orderrequest&)':
EZXMsgTest.cpp:430: error: expected primary-expression before '||' token
EZXMsgTest.cpp:430: error: expected primary-expression before '.' token
EZXMsgTest.cpp:430: error: expected primary-expression before '||' token
EZXMsgTest.cpp:430: error: expected primary-expression before '.' token

行 400friend ostream& operator <<は行であり、行 430 は<<オペレーターのメソッド実装です。

また、コンパイラ エラーが "||" を参照する理由がわかりません。トークン。(私はサーバーにパテされており、いくつかの指示に従ってロケールを「C」に設定し、出力をいくらか改善しましたが、それでも正しく見えません。)

みんな、ありがとう。

4

1 に答える 1

6

orはC++ で予約されています (§2.12/2 C++11)。(§2.6/2)の代替トークンで||あるため、識別子には使用できません。orこの問題を解決するには、変数の名前を別の名前に変更します。

参照。代替トークンの詳細については、この既存の投稿を参照してください。

于 2013-07-01T03:43:24.527 に答える