Flatbuffers создают вектор перечислений

У меня проблемы с созданием вектора перечислений. Т.е. дан следующий файл схемы:

enum Month : short
{
    January,
    February,
    March,
}

table SpecificMonths
{
    Months:[Month];
}

root_type SpecificMonths;

Я пытаюсь создать объект типа SpecificMonths:

flatbuffers::FlatBufferBuilder builder;
Month months[] = {Month_January, Month_March};
auto monthsVector = builder.CreateVector(months, 2);
auto specificMonths = CreateSpecificMonths(builder, monthsVector);

Но это выдает ошибку:

error C2664: 'flatbuffers::Offset<SpecificMonths> CreateSpecificMonths(flatbuffers::FlatBufferBuilder &,flatbuffers::Offset<flatbuffers::Vector<int16_t>>)': cannot convert argument 2 from 'flatbuffers::Offset<flatbuffers::Vector<Month>>' to 'flatbuffers::Offset<flatbuffers::Vector<int16_t>>'

note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

Есть ли способ сделать это? Я предпочитаю решение без std::vector (без выделения).

1 ответ

Проблема в том, что по умолчанию перечисления C++ не имеют указанного базового типа, хотя обычно по умолчанию int, Так что ваши months массив не может быть передан CreateVector, даже если вы его отлили, так как они имеют разные размеры элементов.

Самое простое решение может быть объявить его как int16_t months[] вместо этого, и ваш компилятор должен быть в порядке, преобразуя каждое значение перечисления в качестве инициализатора без приведения.

В качестве альтернативы, скомпилируйте вашу схему с --scoped-enums чтобы получить перечисление стиля C++11, которое имеет правильный базовый тип. Я предполагаю, что компилятор все еще будет жаловаться на прохождение months в CreateVector в этом случае, потому что теперь перечисление строго типизировано, но, по крайней мере, теперь вы можете безопасно привести его, поскольку значения теперь имеют одинаковый размер (например, reinterpret_cast<const int16_t *>(months)).

Другие вопросы по тегам