Я пытаюсь реализовать операторы извлечения потока для класса потока, который наследует 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 из потока.
Забавная деталь в том, что обе ошибки исчезли, когда я удалил оператор реализации.
Кто-нибудь может рассказать, что здесь происходит?
Я решил проблему. Причиной ошибки компиляции является теневое копирование. Ваш 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;
}
};
Постскриптум Первоначальный ответ был совершенно неверным, не нужно его сохранять)
Других решений пока нет …