C++重载运算符<<

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<<' 匹配的候选项 ./ast/Expr.cpp:49: 注意:候选项是: std::ostream& operator<<(std::ostream&, const NumExpr&)
我已经搜索过这个错误,其他人似乎也遇到了类似的问题,但我的情况看起来与他们提供的解决方案相同。我是否做错了一些根本性的事情,还是有一些语法把戏我不知道?
感谢您的帮助!

1
只要使用正确的构造函数创建“NumExpr”对象,这个代码就可以正常工作。 - Alok Save
2
它已经编译通过了:http://ideone.com/aZTvQ。你能给我们展示一下调用代码吗? - Naveen
1
有趣!我还没有为这个函数添加调用代码。它刚刚被创建出来,但是在我没有调用它的情况下就出现了问题。顺便说一下,如果有帮助的话,我正在Linux上使用g++命令。 @Naveen 嗯,看起来这就像我实例化类的方式,不确定为什么在我的环境中无法正常工作。 - Jason Hu
2个回答

6

好的,这里是内容翻译:稍微尝试一下,我可以重现你的问题:请点击此处

问题在于你忘记包含iostream头文件。
请添加:

#include<iostream>

希望一切都能正常工作 :)

编辑:
正如@James Kanze在评论中正确地建议的那样,只需包含

#include<istream>

因为实际上你不需要从iostream中获取所有内容。
istream中包含iostream的缺点是编译时间略微增加。


3
哇,那个......哇。我一直在想为什么它会出问题,但我想我又想太多了。 - chris
顺便提一下,如果有人知道(不想再发另一个问题),如果我在派生类中调用了重载运算符,该指针最初是指向基类的指针,它会调用哪个重载函数?例如:NumExpr* numexpr = new NumExpr; FExpr* expr = numexpr; cout << expr; - Jason Hu
@JasonHu:好的,我们快速调用多态来拯救你:),在基类中添加一个纯虚函数print(),并通过基类重载的<<运算符调用此函数,在每个派生类中重写print()并在其中调用this上的<<,确保我们将对象通过引用传递给基类<<,这使得动态分派成为可能。这里有一个代码示例展示了如何实现。 - Alok Save
只包含 <istream> 应该就足够了,你不需要 <iostream> 中的所有内容。 - James Kanze
@JamesKanze:我同意。除了导入不需要的符号之外,还有其他开销吗?在C++中,只有使用的部分才需要付费,因此唯一涉及的开销可能是编译时间和命名空间污染? - Alok Save
显示剩余6条评论

0

本页面内容:

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

它说要像这样拥有友元函数:

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

所以没有变量声明。只是

const NumExpr

需要帮忙吗?


1
原型可能包含参数的实际名称,也可能不包含。如果有实际名称,该名称将被忽略。 - chris
抱歉各位,我从这些例子中看不出其他的区别。 - Fantastic Mr Fox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接