错误:类型'const char [8]'和'const char [7]'到二进制'运算符<<'的无效操作数

时间:2017-05-26 19:54:43

标签: c++ c++11

我收到以下错误:

错误:类型'const char [8]'和'const char [7]'到二进制'运算符<<'

的操作数无效

使用以下代码。知道为什么吗?

的main.cpp

#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; 
}

为什么?

2 个答案:

答案 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)保留给   实施任何用途。

     

- 以下划线开头的每个名称都保留给   实现用作全局命名空间中的名称。