C++重载运算符<<

Jas*_* Hu 4 c++ overloading operator-overloading

我正在尝试重载一个类的<<运算符,以在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;
}
Run Code Online (Sandbox Code Playgroud)

我把它变成了一个友元函数,所以它可以访问私有变量

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

但是我收到了这个错误

./ast/Expr.cpp:在函数中?std :: ostream&operator <<(std :: ostream&,const NumExpr&)?:./ some/Expr.cpp:50:错误:不匹配?operator <NumExpr ::数?./ast/Expr.cpp:49:注意:候选人是:std :: ostream&operator <<(std :: ostream&,const NumExpr&)

我一直在寻找这个错误,人们似乎遇到了同样的问题,但我看起来似乎是人们给出的解决方案.我有什么根本性的错误,或者是否有一些我不知道的语法诡计?

谢谢您的帮助!

Alo*_*ave 5

好的,这是一点点,我可以重现你的问题:

问题是你忘了包含iostream头文件.
加:

#include<iostream>
Run Code Online (Sandbox Code Playgroud)

它应该工作正常:)

编辑:
正如@James Kanze在评论中正确建议的那样,包含就足够了

#include<istream>
Run Code Online (Sandbox Code Playgroud)

因为你真的不需要一切iostream.
包含iostream内部的缺点istream是编译时间略有增加.

  • 哇,那是.....哇.我想知道为什么它与int有问题,但我想我再次过度思考. (3认同)