ошибка: объявление данных как массива ссылок - PullRequest
2 голосов
/ 25 марта 2019

Код приложения 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;
  }

Я прочитал несколько ответов и узнал, что это не соответствуетс неприятным правилом разбора.

Одним из возможных решений является заключение (& data) [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()));

Компилятор не должен рассматривать эту строку как объявление функции. Как применить правильную грамматику в этом случае?

1 Ответ

0 голосов
/ 25 марта 2019

Один из вариантов - изменить std::string result( на std::string result = std::string( (оставьте остальную часть строки такой же).

Я думаю, что это ошибка компилятора, потому что &data[0] + data.size() не могла появиться в объявлении, но я видел подобных ошибок в gcc ранее (она ошибочно помечает строку как объявление слишком рано при разборе) .

Эта версия также исправила ошибку в gcc 8.3, добавив дополнительный набор скобок:

std::string result ( (base64_enc(&data[0])), base64_enc(&data[0] + data.size()) );
//                   ^                    ^  
...