【问题标题】:Compile errors when implementing stream operators实现流运算符时的编译错误
【发布时间】:2025-12-19 14:20:08
【问题描述】:

我正在尝试为继承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 '&gt;&gt;': no operator found which takes a left-hand operand of type 'MyStream',一个在我实现运算符的行中,一个在我从流中获取 int 的行中。

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

谁能告诉这里发生了什么?

【问题讨论】:

    标签: c++ stl stream operators shadowing


    【解决方案1】:

    我已经解决了这个问题。你得到编译错误的原因是阴影。您的MyStream::operator&gt;&gt;(MyWhateverClass&amp;) 会影响std::basic_iostream::operator&gt;&gt; 的所有版本。为了解决这个问题,您需要使用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;
        }
    };
    

    附:最初的答案完全错误,无需保存)

    【讨论】:

    • 太棒了,这解决了它:) using 在这种情况下对我来说是新的......也谢谢你的链接。