C++ 实现流运算符时的编译错误

C++ 实现流运算符时的编译错误,c++,stl,stream,operators,shadowing,C++,Stl,Stream,Operators,Shadowing,我试图为一个继承std::basic_iostream的流类实现流提取操作符。 不幸的是,我得到了编译错误,我真的不明白 这是我的简化非功能代码: #include <iostream> class MyWhateverClass { public: int bla; char blup; }; class MyBuffer : public std::basic_streambuf<char> { }; class MyStream : publi

我试图为一个继承std::basic_iostream的流类实现流提取操作符。 不幸的是,我得到了编译错误,我真的不明白

这是我的简化非功能代码:

#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二进制“>>”:未找到接受类型为“MyStream”的左侧操作数的运算符,一个在实现运算符的行中,另一个在从流中获取int的行中

有趣的是,当我删除操作符实现时,这两个错误都消失了


有人能告诉我这里发生了什么吗?

我已经解决了这个问题。出现编译错误的原因是阴影。您的MyStream::operator>>MyWhateverClass&隐藏所有版本的std::basic\u 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;
    }
};