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)
).