Osttreamの<<オペレーターをオーバーロードできないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/6380420

質問

編集:const Referenceによって渡された式Expと文字列式

次の方法でクラスをカウト経由で表示しようとしています。

#include <iostream>

class Expression {
private:
    std::string expression;
public:
    Expression(const std::string& expression):
        expression(expression) { }
    friend std::ostream& operator <<(ostream& os, const Expression& exp) {
        return os << exp.expression; }
};

ただし、コンパイルでエラーが表示されます。

main.cpp(9) : error C2061: syntax error : identifier 'ostream'
main.cpp(9) : error C2809: 'operator <<' has no formal parameters

VC ++は私に与えているので、これは特に混乱しています ostream 私が入るときの自動完了の提案として std::. 。これらのエラーの原因は何ですか?また、どのように解決できますか?

役に立ちましたか?

解決

確かにあなたは必要です std::ostream すべての場所で?つまり:

friend std::ostream& operator <<(std::ostream& os, Expression& exp) ...
                                 ^^^

他のヒント

なしで using namespace std; 節(独自の問題がある)、あなたは完全に資格を与える必要があります 全て iostream もの。

次のプログラムでこれを見ることができます。

#include <iostream>

class Expression {
private:
    std::string expression;
public:
    Expression(std::string expression):
        expression(expression) { }
    //                                  added this bit.
    //                                _/_
    //                               /   \
    friend std::ostream& operator <<(std::ostream& os, Expression& exp) {
        return os << exp.expression; }
};

int main (void) {
    Expression e ("Hi, I'm Pax.");
    std::cout << e << std::endl;
    return 0;
}

印刷する:

Hi, I'm Pax.

予想通り。


そして、いくつかのコメントが指摘しているように、あなたは文字列をconst-referenceとして渡すべきです:

#include <iostream>

class Expression {
private:
    std::string expression;
public:
    Expression(const std::string& expression)
    : expression(expression) {
    }
    friend std::ostream& operator <<(std::ostream& os, const Expression& exp) {
        return os << exp.expression;
    }
};

int main (void) {
    Expression e ("Hi, I'm Pax.");
    std::cout << e << std::endl;
    return 0;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top