LINUX.ORG.RU

c++20 to c++17 преобразовать

 


0

0

Компилирую ceph, на строке

using enum fifo::journal_entry::Op;

Получаю:

error: ‘using enum’ only available with ‘-std=c++20’ or ‘-std=gnu++20’

Можно ли как-то преобразовать этот using enum к стандарту с++17?


Если выставляю строку в виде (я не программист):

long unsigned int fifo::journal_entry::Op;

то получаю:

/builddir/build/BUILD/ceph-17.2.5/src/rgw/cls_fifo_legacy.cc:619:48: error: qualified-id in declaration before ';' token
  619 |       long unsigned int fifo::journal_entry::Op;
      |                                                ^
/builddir/build/BUILD/ceph-17.2.5/src/rgw/cls_fifo_legacy.cc:620:10: error: could not convert 'rgw::cls::fifo::FIFO::create' from 'int(const DoutPrefixProvider*, librados::v14_2_0::IoCtx, std::string, std::unique_ptr<rgw::cls::fifo::FIFO>*, optional_yield, std::optional<rados::cls::fifo::objv>, std::optional<std::basic_string_view<char> >, bool, uint64_t, uint64_t)' {aka 'int(const DoutPrefixProvider*, librados::v14_2_0::IoCtx, std::basic_string<char>, std::unique_ptr<rgw::cls::fifo::FIFO>*, optional_yield, std::optional<rados::cls::fifo::objv>, std::optional<std::basic_string_view<char> >, bool, long unsigned int, long unsigned int)'} to 'rados::cls::fifo::journal_entry::Op'
  620 |     case create:```
★★★★★

Ответ на: комментарий от Elyas

у меня и так ceph патчится на новую libfmt-9, эта строка как раз из патча для libfmt. На еще более старую версию не налезет этот патч.

А крайняя ceph-18.0.0 тоже еще сырая :( не собирается.

irton ★★★★★
() автор топика

Можно ли как-то преобразовать этот using enum к стандарту с++17?

А собственно в чём проблема собираться с c++20?

я не программист

Тогда либо найди программиста, либо стань им - сходи на cppreference, посмотри в чём суть этой конструкции и подумай как её реализовать без c++20.

using enum fifo::journal_entry::Op; приносит все значения енума в текущую область видимости. Эквивалентно примерно такому:

constexpr auto unknown = fifo::journal_entry::Op::unknown;
constexpr auto create = fifo::journal_entry::Op::create;
constexpr auto set_head = fifo::journal_entry::Op::set_head;
constexpr auto remove = fifo::journal_entry::Op::remove;

или

enum Op_ {
    unknown = (int)fifo::journal_entry::Op::unknown,
    create = (int)fifo::journal_entry::Op::create,
    set_head = (int)fifo::journal_entry::Op::set_head,
    remove = (int)fifo::journal_entry::Op::remove,
};

Или все обращения к этому енуму просто преобразуй в квалифицированные (fifo::journal_entry::Op::XXX вместо XXX).

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

А собственно в чём проблема собираться с c++20?

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

Тогда либо найди программиста, либо стань им - сходи на cppreference, посмотри в чём суть этой конструкции и подумай как её реализовать без c++20.

Ну вот я сходил на лорчик в девелопмент, тоже нормально. Завтра попробую запатчить.

irton ★★★★★
() автор топика
Ответ на: комментарий от irton

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

Всмысле патчить? У вас используется конструкция из c++20, значит код собирается с c++20. Не надо ничего патчить, надо собирать с c++20.

Ну вот я сходил на лорчик в девелопмент, тоже нормально

В следующий раз пойдёшь в job.

slovazap ★★★★★
()

Можно ли как-то преобразовать этот using enum к стандарту с++17?

если писано под с++20, то возвращаться к с++17 - себе дороже. могут не оказаться в либах разные нужные классы и методы. тут поправишь, а упадет еще в сотне мест, куда похуже упадет.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от slovazap

Вы не поняли, прога написано под с++17 а патч из более новой версии но уже под с++20

В следующий раз пойдёшь в job.

Ненадо вот этого, пройди мимо если не нравится. Следуя твоей логике, тут тогда половину вопросов нужно в job переносить, я что-то сложное спросил в своей теме?

Меня устроит любой вариант: соберется - хорошо, не соберется - будем ждать более другой версии.

irton ★★★★★
() автор топика
Последнее исправление: irton (всего исправлений: 2)
Ответ на: комментарий от irton

как уже сказали, using в данном случае просто дает возможность меньше писать. то есть using надо закомментить и писать полную квалификацию элемента перечисления, там где не будет компилироваться такое место.

типа - вместо

  some_name

писать

fifo::journal_entry::Op::some_name

но там запросто еще много мест с ошибками будет.

alysnix ★★★
()
Ответ на: комментарий от grem

Нужно идти от обратного, с c++20 прога собирается?

нет

Или есть требования сборки под версию компилятора

да эта версия под c++17

где нет поддержки нужных фич из c++20?

а патч новый, под с++20

irton ★★★★★
() автор топика
Последнее исправление: irton (всего исправлений: 1)
Ответ на: комментарий от slovazap

спасибо за помощь, ваши строки очень помогли

выявилось что патч в другом файле убирал подобные строки fifo::journal_entry::Op::create; и я по ним восстановил строки на которых были ошибки.

irton ★★★★★
() автор топика