gpt4 book ai didi

c++ - 使用模板重载 operator<< for endl

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:54 27 4
gpt4 key购买 nike

我有一个继承自 ofstream 的类。我想重载插入运算符,以便它可以减少 ofstream 的替换。

第一个重载是

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

最佳答案

不要尝试。 operator<< 的重载和 operator>>对于 iostream 类型是复杂和困惑的。

您通常应该做的是创建您自己的 std::streambuf子类,并安排一个标准的流类来使用它。通过这种方式,您可以覆盖字符流数据所发生的事情,而不必担心重载的运算符、类型转换、格式化和操纵器。例如,参见 James Kanze 的 Filtering Streambufs文章,或 Boost 库 boost::iostreams .

关于c++ - 使用模板重载 operator<< for endl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23940897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com