覆盖运算符<<控制台输出不适用于成员变量

时间:2012-11-23 00:29:36

标签: c++ pointers operator-overloading iostream ostream

我有一个MyList类覆盖<<运算符,以便能够将自己登录到控制台:

class MyList {
public:
    vector<int> *numbers;
};
ostream& operator<<(ostream& os, MyList& l);

实现:

ostream& operator<<(ostream& os, MyList& l) {
    for (int i = 0; i < l.numbers->size(); i++) {
        os << l.numbers->at(i);         
    }
    return os;
}

在另一个类中,我有一个MyList类型的成员变量,我无法将其打印到控制台。有趣的是,本地MyList变量工作正常:

class A {
public:
    MyList list;
    void someMethod() const;
};

实现:

void A::someMethod() const {
    MyList local;
    // Set up local list.
    cout << "Local:" << local; // OK!
    cout << "Member:" << list; // ERROR!
}

这是错误消息:

Invalid operands to binary expression ('basic_ostream<char,
std::__1::char_traits<char>>' and 'const MyList')

Xcode的自动修复建议引用list

cout << "Member:" << &list;

这将编译,但(显然)它会打印list的地址,而不是我的内容。我不明白这两个变量在<<运算符方面的区别。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:6)

我不认为这是你的真实代码,但我猜是这样的:

ostream& operator<<(ostream& os, const MyList& l)
//                                 |
//                             note const

要么就是忘记尾随的;

,要么真是愚蠢
class A {
public:
    MyList list;
    void someMethod();
};  // <------- here

答案 1 :(得分:2)

看来,你在几个地方省略了const:就目前而言,你的代码应该没问题。但是,如果您具有const成员函数,则成员为const,并且您无法将非const引用绑定到const对象。因此,通常声明输出运算符将const&作为第二个参数:

std::ostream& operator<< (std::ostream& os, MyList const& l) {
    ...
}