gpt4 book ai didi

C++流作为重载运算符时的参数<<

转载 作者:可可西里 更新时间:2023-11-01 15:52:55 24 4
gpt4 key购买 nike

我正在尝试编写自己的日志记录类并将其用作流:

logger L;
L << "whatever" << std::endl;

这是我开始的代码:

#include <iostream>

using namespace std;


class logger{
public:
template <typename T>
friend logger& operator <<(logger& log, const T& value);
};

template <typename T>
logger& operator <<(logger& log, T const & value) {
// Here I'd output the values to a file and stdout, etc.
cout << value;
return log;
}

int main(int argc, char *argv[])
{
logger L;
L << "hello" << '\n' ; // This works
L << "bye" << "alo" << endl; // This doesn't work
return 0;
}

但我在尝试编译时遇到错误,说没有 operator<< 的定义(使用 std::endl 时):

pruebaLog.cpp:31: error: no match for ‘operator<<’ in ‘operator<< [with T = char [4]](((logger&)((logger*)operator<< [with T = char [4]](((logger&)(& L)), ((const char (&)[4])"bye")))), ((const char (&)[4])"alo")) << std::endl’

所以,我一直在尝试重载 operator<< 以接受这种流,但这让我发疯了。我不知道该怎么做。例如,我一直在寻找 ostream 头文件中 std::endl 的定义,并用这个头文件编写了一个函数:

logger& operator <<(logger& log, const basic_ostream<char,char_traits<char> >& (*s)(basic_ostream<char,char_traits<char> >&))

但运气不好。我试过使用模板而不是直接使用 char,也试过只使用“const ostream& os”,但什么也没有。

另一件让我烦恼的事情是,在错误输出中,operator<< 的第一个参数发生了变化,有时它是对指针的引用,有时看起来像双重引用...

最佳答案

endl是一只奇怪的野兽。它不是一个常数值。实际上,它是一个函数。您需要一个特殊的覆盖来处理 endl 的应用程序:

logger& operator<< (logger& log, ostream& (*pf) (ostream&))
{
cout << pf;
return log;
}

这接受插入一个接受 ostream 的函数引用并返回 ostream引用。这就是endl是。

编辑:响应 FranticPedantic 的有趣问题“为什么编译器不能自动推导这个?”。原因是,如果你再深入研究,endl实际上它本身就是一个模板 函数。它被定义为:

template <class charT, class traits>
basic_ostream<charT,traits>& endl ( basic_ostream<charT,traits>& os );

也就是说,它可以采用任何类型的 ostream作为它的输入和输出。所以问题不在于编译器无法推断出 T const &可能是一个函数指针,但它无法确定哪个 endl你打算传入。 operator<< 的模板化版本问题中出现的将接受指向任何函数的指针作为其第二个参数,但与此同时,endl模板代表一组无限的潜在函数,因此编译器不能在那里做任何有意义的事情。

提供 operator<< 的特殊重载其第二个参数与 endl特定实例匹配模板允许调用解析。

关于C++流作为重载运算符时的参数<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2803403/

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