C ++应用程序代码可以在GCC 4.1上正常编译。现在,我将GCC版本升级到4.4X,但出现错误。
error: declaration of ‘data’ as array of references
代码:
inline std::string base64_encode(const std::vector< unsigned char >& data)
{
if (data.empty())
{
return "";
}
using namespace boost::archive::iterators;
typedef base64_from_binary<
transform_width< const unsigned char*, 6, 8> > base64_enc;
std::string result(base64_enc(&data[0]),
base64_enc(&data[0] + data.size()));
static const std::string base64_padding[] = { "", "==", "=" };
result.append(base64_padding[data.size() % 3]);
return result;
}
我读了几个答案,才知道这不符合令人烦恼的解析规则。
一种可能的解决方案是封闭 (&数据)[0] 要么 std :: string result({base64_enc(&data [0]}), base64_enc(&data [0] + data.size();
std::string result(base64_enc(&data[0]),
base64_enc(&data[0] + data.size()));
编译器不应将此行视为函数声明。在这种情况下,我该如何应用正确的语法?
答案 0 :(得分:0)
一种选择是将std::string result(
更改为std::string result = std::string(
(其余各行保持相同)。
我认为这是一个编译器错误,因为&data[0] + data.size()
不能在声明中出现,但是我之前见过similar bugs in gcc(在解析时过早将其错误地标记为声明)。
此版本还在gcc 8.3中为我解决了该错误,并增加了一组括号:
std::string result ( (base64_enc(&data[0])), base64_enc(&data[0] + data.size()) );
// ^ ^