stringstream<<运算符不能与C ++ 11的Macro一起使用

时间:2017-09-24 19:27:30

标签: c++ c++11 macros gnu

我们有一些像

这样的宏
#define LOGG(out,line,file,.....)
    std::stringstream logprocess;  \
    logprocess << std::stringstream(out) ;                \
    functiona(out,....,....);
}

因此传递给LOGG的事情可能是:

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

所以我们主要使用&#34;&lt;&lt;&#34;从whater构造函数到我们想要的类型然后发送到MACRO LOGG。它与gnuc ++ 98完美配合,但我们用-std = c ++ 11编译,它给出了错误:

错误:&#39;运营商&lt;&lt;&lt;&# (操作数类型是&#39; std :: stringstream {aka std :: basic_stringstream}&#39;和#std :: stringstream {aka std :: basic_stringstream}&#39;)

1 个答案:

答案 0 :(得分:0)

好吧,正如@thundium指出的那样,错误信息非常清楚。 std :: stringstream不能接受std :: stringstream使用它的&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());

这是full example