【问题标题】:Flatbuffers create vector of enumsFlatbuffers 创建枚举向量
【发布时间】:2018-12-04 16:59:47
【问题描述】:

我在创建枚举向量时遇到了麻烦。 IE。给定以下架构文件:

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 的解决方案(无分配)。

【问题讨论】:

    标签: c++ flatbuffers


    【解决方案1】:

    问题在于,默认情况下,C++ 枚举没有指定的底层类型,尽管它通常默认为int。所以你的months 数组不能传递给CreateVector,即使你把它转换了,因为它们有不同大小的元素。

    最简单的解决方案可能是将其声明为int16_t months[],并且您的编译器应该可以将每个枚举值转换为初始化器而不进行强制转换。

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

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多