我有一个继承自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;
}
答案 0 :(得分:1)
不要试试。 iostream类型的operator<<
和operator>>
重载是复杂而混乱的。
您通常应该做的是创建自己的std::streambuf
子类,并安排标准流类来使用它。这样,您可以覆盖字符流数据所发生的情况,而无需担心重载的运算符,类型转换,格式设置和操纵器。例如,请参阅James Kanze的Filtering Streambufs文章或Boost图书馆boost::iostreams
。