0

编辑:通过 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当我输入std::. 是什么导致了这些错误,如何解决?

4

2 回答 2

13

您肯定需要std::ostream在所有位置吗?IE:

friend std::ostream& operator <<(std::ostream& os, Expression& exp) ...
                                 ^^^
于 2011-06-17T01:19:06.640 回答
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;
}
于 2011-06-17T01:34:56.133 回答