我收到以下错误:
错误:类型'const char [8]'和'const char [7]'到二进制'运算符<<'
的操作数无效使用以下代码。知道为什么吗?
#include <sstream> // std::stringstream
#define logStream(MSG) _logStream(MSG)
void _logStream(std::string MSG)
{
std::stringstream _trace_stream_;
_trace_stream_ << "logStream: " << MSG << std::endl;
}
int main()
{
logStream("Hello, " << "world!"); // compile error here
return 0;
}
但是,使用内联logStream宏时没有编译错误。
#include <sstream> // std::stringstream
#define logStream(MSG) { \
std::stringstream trace_stream; \
trace_stream << "logStream: " << MSG << std::endl; \
}
int main()
{
logStream("Hello, " << "world!");
return 0;
}
为什么?
答案 0 :(得分:4)
logStream("Hello, " << "world!")
对于两个参数都是字符串文字(又名operator<<
)的情况,const char[n]
没有重载。
对于其中一个参数是流的情况,存在operator<<
的重载。但是流只在函数logStream()
中创建。将参数传递给函数时,它尚不可用。
要解决组合多个记录值的问题,您可以使用operator+
的{{1}}:
std::string
同样,如果其中一个参数是数字:
logStream(std::string("Hello, ") + "world!");
这个问题没有标记为C ++ 14,但是你可以通过使用新的string literal operators添加一些语法糖:
logStream(std::string("Hello, ") + "world " + std::to_string(42) + "!" );
答案 1 :(得分:0)
正如zett42所说,你不能使用operator&lt;&lt;来连接字符串。 (除非你编写自己的重载),但你的程序仍然有未定义的行为。引自c ++ 14标准:
17.6.4.3.2全局名称[global.names]
始终保留某些名称和功能签名集 实施:
- 每个包含双下划线_ _的名称或以。开头的名称 下划线后跟一个大写字母(2.12)保留给 实施任何用途。
- 以下划线开头的每个名称都保留给 实现用作全局命名空间中的名称。