重载运算符<<对于使用模板的endl

时间:2014-05-29 18:57:03

标签: c++ templates fstream ofstream

我有一个继承自ofstream的班级。我想重载插入操作符,以便它可以减少对stream的重新定位。

第一个重载是

template<class T>
MyClass& Myclass::operator<<(const T& in);

并尝试处理像std::endl

这样的操纵器
template<
    template<class, class> class Outer,
    class Inner1, 
    class Inner2
>
MyClass& Myclass::operator<<(Outer<Inner1, Inner2>& (*foo)(Outer<Inner1, Inner2>&));

如果我尝试编译:

Myclass output; output << 3 << "Hi";

然后一切正常,但当我尝试添加std::endl

Myclass output; output << 3 << "Hi" << std::endl;

temp.cpp: In function 'int main()':
temp.cpp:10: error: no match for 'operator<<' in '((Stream*)ss. Stream::operator<< [with T = int](((const int&)((const int*)(&3)))))->Stream::operator<< [with T = char [3]](((const char (&)[3])"Hi")) << std::endl'
/usr/include/c++/4.1.2/bits/ostream.tcc:657: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.1.2/bits/ostream.tcc:597: note:                 std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]

我特别不明白为什么在错误打印输出中有const int*。 这也是尝试学习更多关于模板的内容,但我也试图用一段代码覆盖更多的操纵器。

编辑SSCCE:

#include <fstream>
#include <iostream>

class Myclass : public std::ofstream {
//class Stream {
    private:

    public:

        template<class T>
        Myclass& operator<<(const T& data_in) {
            std::cout << data_in;
            return *this;
        }


        template<
            template<class, class> class Outer_T, 
            class Inner_T1, 
            class Inner_T2
            >
        Myclass& operator<<(Outer_T<Inner_T1, Inner_T2>& (*foo)(Outer_T<Inner_T1, Inner_T2>&)) {
            return foo(*this);
        }

};

int main() {
    Myclass output;
    output << 3 << "Hi";
    output << 3 << "Hi" << std::endl;
}

1 个答案:

答案 0 :(得分:1)

不要试试。 iostream类型的operator<<operator>>重载是复杂而混乱的。

您通常应该做的是创建自己的std::streambuf子类,并安排标准流类来使用它。这样,您可以覆盖字符流数据所发生的情况,而无需担心重载的运算符,类型转换,格式设置和操纵器。例如,请参阅James Kanze的Filtering Streambufs文章或Boost图书馆boost::iostreams