为什么我不能重载ostream的<<运营商?

时间:2011-06-17 01:17:06

标签: c++ operator-overloading ostream

编辑:通过const引用传递表达式exp和字符串表达式

我试图通过cout以下列方式显示一个类:

#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

这尤其令人困惑,因为当我输入ostream时,VC ++会将std::作为自动完成建议。造成这些错误的原因是什么,以及如何解决?

2 个答案:

答案 0 :(得分:12)

当然,您需要在所有地点std::ostream?即:

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

答案 1 :(得分:2)

如果没有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;
}