c++,将任何类型的数据(模板T)打印到控制台
c++, printing data of any type (template T) to console
在我的代码中,我想要实现一个将任何数据类型打印到控制台的函数。函数总是接收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
,您需要重载string
0。
运算符应该在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<<
,该类型不会重载它,如我的回答开头所述。
相关文章:
- 访问和打印元组中的数据,并使用 C++14 使用模板函数显示数据
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 使用模板打印出类
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 如何从主 C++ 向模板类中的方法发送打印函数
- 使用模板函数打印智能指针矢量
- 在模板功能中打印任何结构
- 如何打印递归 lambda 模板的名称
- 如何使用 is_invocable() 创建用于重载<<打印对象的模板?
- 打印函数模板的内容进行类指针
- c++,将任何类型的数据(模板T)打印到控制台
- GDB有没有办法在不省略模板参数的情况下打印类型
- 打印模板的值
- C++模板方法选择正确的数据打印方式
- C++以十进制打印的模板化流字符
- 如何在编译时漂亮地打印模板参数的名称
- 如何使用可变模板打印出函数的参数
- C++模板打印对象名称
- Qt/pyQt/PySide -创建文档模板打印
- 没有对象的模板打印成员变量