Переопределяющий оператор & lt; & lt; для вывода на консоль не работает для переменных-членов

У меня есть класс 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

Решение

Я не думаю, что это ваш настоящий код, но вот мое предположение:

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

Или это, или что-то действительно глупое, как забыть о конце ;:

class A {
public:
MyList list;
void someMethod();
};  // <------- here
6

Другие решения

Похоже, вы пропустили const в нескольких местах: ваш код должен быть в порядке. Однако, если у вас есть const функция-член, члены const и вы не можете связать неconst ссылка на const объект. Таким образом, операторы вывода обычно объявляются const& в качестве второго аргумента:

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

По вопросам рекламы [email protected]