我正在努力实现这个目标:
#include <iostream>
#include <sstream>
void log(
const char* argFile,
int argLineNb,
const char* argFunction,
std::stringstream& argString) {
std::cout << argFile << ":" << argLineNb << " " << argFunction
<< " " << argString.str()<< std::endl;
}
/**
* \brief Macro declarations
*/
#define LOG_TEST(f) \
log(__FILE__, __LINE__, \
__FUNCTION__, (std::ostringstream << f))
int main(int argc, char** argv) {
LOG_TEST("HELLO");
LOG_TEST("HELLO" << " !");
return 0;
}
问题是我真的不知道怎么做,因为我收到以下错误:
无效初始化类型'std :: stringstream&amp;的引用{std :: basic_stringstream&amp;}'来自类型'std :: basic_ostream :: __ ostream_type {aka std :: basic_ostream
的表达式
我不知道是否有一种更简单的方法可以通过提升...
答案 0 :(得分:2)
这里的主要问题是:(std::stringstream() << f)
如果您阅读std::stringstream
operator<<(...)
的引用,您会发现它是继承自std::ostream
http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/
问题是operator<<(...)
返回std::ostream
,因此,当您通过(std::stringstream() << f)
时,实际上是将std::ostream
传递给需要std::stringstream
的函数(因此,来自ostream的字符串流的无效初始化)
要实现您想要的,确切地说,您必须修改宏的工作方式。尝试这样的事情:
#define LOG_TEST(f) \
do { std::stringstream s; \
s << f; \
log(__FILE__, __LINE__, __FUNCTION__, s); \
} while (0)