перегрузка оператора < - PullRequest
       1

перегрузка оператора <

2 голосов
/ 16 ноября 2011

Код:

std::ostream& operator<<(std::ostream& os, const BmvMessage& bm);

Я не вижу ничего неправильного, но выдает следующую ошибку:

ошибка: `std :: ostream & BMV :: BmvMessage:: operator << (std :: ostream &, const BMV :: BmvMessage &) 'должен принимать ровно один аргумент. </p>

Я не знаю, почему это происходит.Любые предложения приветствуются.Я делал это раньше и никогда не сталкивался с этой ошибкой.Я также проверил онлайн, и это выглядит так:

ostream& operator<< (ostream& out, char c );`

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Оператор должен быть функцией free , потому что его первый аргумент не того же типа, что и ваш класс.В общем, когда вы перегружаете бинарный оператор Foo, версия функции-члена принимает только один аргумент, а FOO(a, b) означает a.Foo(b).

, поскольку a << b вызовет a.operator<<(b), но a - это поток, он нам не нужен.

Так что сделайте свободную функцию или, возможно, бесплатную функцию друга.Наличие открытой toString функции-члена может помочь:

class Foo {
public:
  std::string toString() const;
  // ...
};

std::ostream & operator<<(std::ostream & o, const Foo & x) {
  return o << x.toString(); 
}
3 голосов
/ 16 ноября 2011

Возьмите operator<< вне класса, что делает его свободной функцией. Сделайте его friend класса, если ему нужен доступ к private частям.

1 голос
/ 16 ноября 2011

Вы используете подпись свободной формы для определения функции-члена.Функции-члены имеют неявный аргумент this, поэтому в вашем случае попытка функции-члена перегрузить operator << приведет к функции, которая принимает 3 аргумента: неявная this, std::ostream& os и BmvMessage const& bm.

Вы не можете определять потоковые операторы как члены, так как первый аргумент должен быть класса потока.Вместо этого вы определяете их как свободные функции, возможно, в качестве друзей, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...