Flatbuffers创建枚举向量

时间:2018-12-04 16:59:48

标签: c++ 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 个答案:

答案 0 :(得分:0)

问题在于默认情况下,C ++枚举没有指定的基础类型,尽管它通常默认为int。因此,即使您进行了转换,您的months数组也无法传递给CreateVector,因为它们具有不同的大小元素。

最简单的解决方案可能是将其声明为int16_t months[],并且您的编译器希望可以将每个枚举值转换为初始值设定项而无需强制转换。

或者,使用--scoped-enums编译架构以获得具有正确基础类型的C ++ 11样式枚举。我猜编译器在这种情况下仍然会抱怨将months传递给CreateVector,因为现在枚举是强类型的,但是至少现在您可以放心地对其进行强制转换,因为值现在大小相同(例如reinterpret_cast<const int16_t *>(months))。