4

Java で toString() をエミュレートするクラスの << 演算子をオーバーロードしようとしています。クラスがあり、出力したいNumExprプライベート変数があります。numberここにそれらがあります:

NumExpr::NumExpr( string n ) {
    number = atoi( n.c_str() );
}
string NumExpr::name() {
    return "num";
}
ostream & operator<<(ostream &s, const NumExpr &num) {
    s << num.number;
    return s;
}

プライベート変数にアクセスできるようにフレンド関数にしました

class NumExpr : public Expr {
    public:
        NumExpr( string v );
        string name();
    private:
        int number;
        friend ostream& operator<<(ostream &s, const NumExpr &num);
};

しかし、私はこのエラーが発生しています

./ast/Expr.cpp: 関数 ?std::ostream& operator<<(std::ostream&, const NumExpr&)?: ./ast/Expr.cpp:50: エラー: ?operator<NumExpr:: に一致しません番号?./ast/Expr.cpp:49: 注: 候補は次のとおりです: std::ostream& operator<<(std::ostream&, const NumExpr&)

私はこのエラーを検索しました。人々は同じ問題を抱えているようですが、私のものは人々が提供している解決策のように見えます。私がやっている根本的に間違っていることはありますか、それとも私が気付いていない構文のシェナニガンがありますか?

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

4

2 に答える 2

5

わかりました、少し遊んでみます。問題を再現できます

問題は、iostream ヘッダー ファイルを含めるのを忘れていることです。
追加:

#include<iostream>

そして、それはうまくいくはずです:)

EDIT:
@James Kanzeがコメントで正しく示唆しているように、含めるだけで十分です

#include<istream>

iostream本当にすべてを必要とするわけではないからです。の中
に含めることの欠点は、コンパイル時間が少し増えることです。iostreamistream

于 2012-05-28T06:01:22.043 に答える
0

このページでは:

http://www.cplusplus.com/forum/beginner/13164/

次のような友人機能を持つように指示されています。

friend std::ostream& operator<< (std::ostream&, const NumExpr&); <- 

したがって、変数宣言はありません。ただ

const NumExpr

助けはありますか?

于 2012-05-28T05:50:24.020 に答える