实现流运算符时编译错误

时间:2017-12-03 08:19:39

标签: c++ stl stream operators shadowing

我正在尝试为继承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的行中的一行。

有趣的细节是,当我删除运算符实现时,两个错误都消失了。

有谁能说出这里发生了什么?

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。您收到编译错误的原因是阴影。您的MyStream::operator>>(MyWhateverClass&)会隐藏std::basic_iostream::operator>>的所有版本。要解决此问题,您需要使用using declaration

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;
    }
};

P.S。最初的答案是完全错误的,不需要保存它)