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

时间:2019-01-15 09:39:54

标签: c++ templates std

在我的代码中,我想实现一个将任何数据类型打印到控制台的功能。 函数始终将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类型的右侧操作数的运算符(或没有可接受的转换)

我如何拥有可以打印任何类型数据的功能

1 个答案:

答案 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<<的类型不会重载,如我的答案开头所述。