c++,将任何类型的数据(模板T)打印到控制台

c++, printing data of any type (template T) to console

本文关键字:模板 打印 控制台 数据 任何 类型 c++      更新时间:2023-10-16
在我的代码中,我想要实现一个将任何数据类型打印到控制台的函数。函数总是接收CCD_ 1作为第一自变量并且接收每次可以变化的数据作为第二自变量。

Mutex_Loggers.h

namespace Loggers
{
std::mutex m_mutex;
template<typename T>
void sharedLog(const std::string& message, T data)
{
std::lock_guard<std::mutex> locker(m_mutex);
std::cout << message << data << std::endl;
}
}

以及调用它的文件之一,例如main.cpp

#include "Mutex_Loggers.h"
/*other stuff*/
Loggers::sharedLog("IN THREAD: ", std::this_thread::get_id());
Loggers::sharedLog("IN APP CREATION ", nullptr);
Loggers::sharedLog("IN create_CtrApp_and_register ", {1,2,3});

在编译时,我得到了以下错误:

C2593运算符<<是不明确的

C2679二进制<<未找到采用T类型右手操作数的运算符(或没有可接受的转换)

我如何具有打印任何类型的数据的功能

问题是,您正在为那些不会重载运算符的类型调用operator<<,然后在sharedLog函数中调用该运算符。

为了以这种方式将类型为T的实例写入std::ostream,您需要重载string0。

运算符应该在T类型之外实现,并且它将具有以下签名:

std::ostream& operator<< (std::ostream &out, const T& arg);

如果它需要访问T的私有和受保护成员,也应该声明为friend:

friend std::ostream& operator<< (std::ostream &out, const T& arg);

它应该返回作为第一个参数接收的out引用,以便可以链接调用:

str << a << b << c;

您可以在此处找到更多详细信息:https://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/

C2593运算符<lt;不明确

您有两个或两个以上的实现,这两个实现都是候选的,编译器不知道该选择哪一个。错误消息包含指向候选者的其他详细信息,以便您可以查看哪些是冲突类型。请在此处查看更多信息:错误C2593:';运算符<lt';不明确

C2679二进制<lt;找不到接受T类型右手操作数的运算符(或没有可接受的转换)

您正在为类型调用operator<<,该类型不会重载它,如我的回答开头所述。