C ++重载运算符<<

时间:2012-05-28 05:44:09

标签: c++ operator-overloading 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;
}

我把它变成了友方函数,因此它可以访问私有变量

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&amp;运算符&lt;&lt;(std :: ostream&amp;,const NumExpr&amp;)?:   ./ast/Expr.cpp:50:错误:不匹配?运算符&lt; NumExpr :: number?   ./ast/Expr.cpp:49:注意:候选人是:std :: ostream&amp;运算符&lt;&lt;(std :: ostream&amp;,const NumExpr&amp;)

我已经搜索过这个错误,人们似乎遇到了同样的问题但我的看起来似乎是人们给出的解决方案。我正在做一些根本性的错误,还是有一些我不知道的语法诡计?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

好的,这是一点点,我可以 reproduce your problem

问题是您忘记包含iostream头文件 添加:

#include<iostream>

它应该可以正常工作:)

修改
正如@James Kanze在评论中正确建议的那样,包含

就足够了
#include<istream>

因为你真的不需要iostream的所有内容 在iostream内包含istream的缺点是编译时间略有增加。

答案 1 :(得分:0)

在此页面上:

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

它说朋友的功能是这样的:

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

所以没有变量的贬值。只是

const NumExpr

任何帮助?