gpt4 book ai didi

C++模板运算符编译错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:52 26 4
gpt4 key购买 nike

我正在尝试制作一个类似于 std::ostream 的 C++ 类,它将接受它的输入并写入两个 std::ostream在构造函数中给出。在这里它和合适的operator<<一起模板:

struct SplitStream
{
SplitStream(std::ostream & a_, std::ostream & b_) : a(a_), b(b_) {}
std::ostream & a, & b;
};


template<class T>
const SplitStream & operator << (const SplitStream & sp, const T & x)
{
sp.a << x;
sp.b << x;
return sp;
}

该代码下方的几行,我尝试使用此类:

void foo(SplitStream & out)
{
double some_double = 1.23;
out << "bar" << some_double << std::endl;
}

我得到了这个相当神秘的错误:

... error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'const SplitStream' (or there is no acceptable conversion) ...

我做错了什么?我试图定义 operator<<没有常量,它也没有编译。

最佳答案

眼前的问题是std::endl不是一个对象,而是一个声明如下的函数模板:

template <typename cT, typename Traits>
std::basic_ostream<cT, Traits>& endl(std::basic_ostream<cT, Traits>&);

要像这样使用函数指针,需要推导模板参数。为此,类std::basic_ostream<cT, Traits>operator<<() 声明合适的重载:

template <typename cT, typename Traits>
std::basic_ostream<cT, Traits>& std::baisic_ostream<cT, Traits>::operator<< (
std::basic_ostream<cT, Traits>& (*manip)(std::basic_ostream<cT, Traits>&));

这样,编译器可以在 std::endl 时推断出正确的实例化。函数被引用。

然而,所有这些都完全无关紧要,因为您尝试做的事情最好以完全不同的方式完成!您应该创建合适的流缓冲区并使用合理构造的 std::ostream使用此自定义流缓冲区。下面是如何正确执行此操作的完整示例(我之前已经发布过,但只发布了几十次...):

#include <streambuf>

struct teebuf
: std::streambuf
{
std::streambuf* sb1_;
std::streambuf* sb2_;

teebuf(std::streambuf* sb1, std::streambuf* sb2)
: sb1_(sb1), sb2_(sb2) {
}
int overflow(int c) {
typedef std::streambuf::traits_type traits;
bool rc(true);
if (!traits::eq_int_type(traits::eof(), c)) {
traits::eq_int_type(this->sb1_->sputc(c), traits::eof())
&& (rc = false);
traits::eq_int_type(this->sb2_->sputc(c), traits::eof())
&& (rc = false);
}
return rc? traits::not_eof(c): traits::eof();
}
int sync() {
bool rc(true);
this->sb1_->pubsync() != -1 || (rc = false);
this->sb2_->pubsync() != -1 || (rc = false);
return rc? 0: -1;
}
};

#include <fstream>
#include <iostream>

int main()
{
std::ofstream fout("tee.txt");
teebuf sbuf(fout.rdbuf(), std::cout.rdbuf());
std::ostream out(&sbuf);
out << "hello, world!\n";
}

关于C++模板运算符编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13943280/

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