为什么我不能重载 ostream 的 << 运算符?

Why can't I overload ostream's << operator?

本文关键字:lt 运算符 不能 重载 ostream 为什么      更新时间:2023-10-16

EDIT:通过常量引用传递表达式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

这尤其令人困惑,因为当我输入CCD_ 2时,VC++将CCD_。造成这些错误的原因是什么?如何解决这些错误?

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

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

如果没有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引用传递:

#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;
}