字符串流<<运算符不适用于具有 C++11 的宏

stringstream << operator doesnot work with Macro with C++11

本文关键字:lt C++11 的宏 运算符 字符串 不适用 适用于      更新时间:2023-10-16

我们有一些宏观

#define LOGG(out,line,file,.....)
    std::stringstream logprocess;  
    logprocess << std::stringstream(out) ;                
    functiona(out,....,....);
}

因此,要传递给Logg的东西可能是:

LOGG(message<<"i would like to print"<<interger,......)

所以我们主要使用"&lt;&lt;"从我们想要的构造器中构造函数,然后发送到宏观登录。它与GNUC 98完美搭配,但我们已与-STD = C 11一起编译,它给出了错误:

错误:"操作员&lt;&lt;''无匹配(操作数类型为'std :: stringstream {aka std :: basic_stringstream}'and'std :: stringstream {aka std :: basic_stringstream}')

好吧,正如@thundium所指出的那样,错误消息很明显。std :: stringstream无法使用它的&lt;&lt;&lt;操作员。也许您可以使用此方法:

logprocess << std::stringstream(out).str()

,但我不推荐。

我不能确定您在代码中如何确切使用此宏,但是我确实发现了一些可能的改进,例如:

  • 为什么您的宏将文件和行作为参数接收?这是一个宏,它可以使用__FILE____LINE__固有的
  • 为什么在一个足够的时候创建两个字符串流?
  • 为什么在实际日志记录设施周围有一个其他功能包装器,而不仅仅是使用std :: cout或std :: ofstream?

这是两个简单而微不足道的实现,我认为您可以在代码中使用最低调整:

#define LOGG1(...) 
    std::cout << __FILE__ << "[" << __LINE__ << "] " <<  __VA_ARGS__ << "n"
#define LOGG2(...) 
    std::stringstream ss; 
    ss << __FILE__ << "[" << __LINE__ << "] " <<  __VA_ARGS__ << "n"; 
    functional(ss.str());

这是一个完整的示例