在我的代码中,我想实现一个将任何数据类型打印到控制台的功能。
函数始终将string
作为第一个参数,并将每次都可能变化的数据作为第二个参数。
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
类型的右侧操作数的运算符(或没有可接受的转换)
我如何拥有可以打印任何类型数据的功能
答案 0 :(得分:3)
问题是您正在调用operator<<
的类型,这些类型不会重载该运算符,然后您可以在sharedLog
函数内部调用该运算符。
为了以这种方式将类型T
的实例写入std::ostream
,您需要重载operator<<
。
该运算符应在T
类型之外实现,并且应具有以下签名:
std::ostream& operator<< (std::ostream &out, const T& arg);
如果需要访问T
的私有成员和受保护成员,则还应将其声明为朋友:
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运算符<<不明确
您有2个或多个实现都是候选,并且编译器不知道选择哪个。该错误消息包含指向候选人的其他详细信息,因此您可以查看哪些是冲突类型。在此处查看更多信息:error C2593: 'operator <<' is ambiguous
C2679二进制<<未找到采用T类型的右操作数(或没有可接受的转换)的运算符
您正在呼叫operator<<
的类型不会重载,如我的答案开头所述。