Ошибки компиляции при реализации потоковых операторов

Я пытаюсь реализовать операторы извлечения потока для класса потока, который наследует std::basic_iostream<char>,
К сожалению, я получаю ошибки компиляции, которые я не совсем понимаю.

Это мой упрощенный (не функциональный) код:

#include <iostream>

class MyWhateverClass {
public:
int bla;
char blup;
};

class MyBuffer : public std::basic_streambuf<char> {
};

class MyStream : public std::basic_iostream<char> {
MyBuffer myBuffer;
public:
MyStream() : std::basic_iostream<char>(&myBuffer) {}

std::basic_iostream<char>& operator >> (MyWhateverClass& val) {
*this >> val.bla;
*this >> val.blup;
return *this;
}
};

int main()
{
MyStream s;
s << 1;
int i;
s >> i;

return 0;
}

Я получаю две похожие ошибки:
C2678 binary '>>': no operator found which takes a left-hand operand of type 'MyStream'один в строке, где я реализую оператор, и один в строке, где я получаю int из потока.

Забавная деталь в том, что обе ошибки исчезли, когда я удалил оператор реализации.

Кто-нибудь может рассказать, что здесь происходит?

0

Решение

Я решил проблему. Причиной ошибки компиляции является теневое копирование. Ваш MyStream::operator>>(MyWhateverClass&) тени всех версий std::basic_iostream::operator>>, Для решения этой проблемы вам необходимо использовать используя декларацию:

class MyStream : public std::basic_iostream<char> {
MyBuffer myBuffer;
public:
MyStream() : std::basic_iostream<char>(&myBuffer) {}

using std::basic_iostream<char>::operator>>;
std::basic_iostream<char>& operator >> (MyWhateverClass& val) {
*this >> val.bla;
*this >> val.blup;
return *this;
}
};

Постскриптум Первоначальный ответ был совершенно неверным, не нужно его сохранять)

1

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

Других решений пока нет …

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