2017-12-03 201 views
0

我正在嘗試爲繼承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

我已經解決了這個問題。你編譯錯誤的原因是陰影。 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.最初的回答是完全錯誤的,不需要保存它)

+0

太棒了,這固定它:)'使用'對我來說是新的在這種情況下...也謝謝你的鏈接。 – user2328447