Flatbuffers создают вектор перечислений - PullRequest
0 голосов
/ 04 декабря 2018

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

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 Ответ

0 голосов
/ 04 декабря 2018

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

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

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

...