C++安装pybeesgrid遇enum constant布尔上下文错误求解决
解决boost::tribool赋值时的编译错误
问题场景
我是C++新手,尝试安装pybeesgrid包时,其pybeesgrid.cpp文件中这段代码出现编译错误:
void buildGridsFromNpArrWorkFn( PyArrayObject * bits_and_config_ptr, PyObject * maybe_grid_structure, const size_t offset, const size_t nb_todo, std::vector<GeneratedGrid> &grids) { PyArrayObject * structure_arr = nullptr; if (maybe_grid_structure != Py_None) { structure_arr = reinterpret_cast<PyArrayObject*>(maybe_grid_structure); } for(size_t i = offset; i < offset + nb_todo; i++) { Grid::idarray_t id; size_t pos = 0; for(size_t c = 0; c < NUM_MIDDLE_CELLS; c++) { float cell = get_float(bits_and_config_ptr, i, pos); ++pos; if(cell == 1.) { id[c] = true; } else if(cell == 0) { id[c] = false; } else { id[c] = boost::tribool::indeterminate_value; } }
编译错误提示:
error: enum constant in boolean context [-Werror=int-in-bool-context] 236 | id[c] = boost::tribool::indeterminate_value;
我试过抑制警告但编译失败,也试过改成id[c] = static_cast<uint64_t>(boost::tribool::indeterminate_value);,但没有效果。
解决方法
问题核心是Grid::idarray_t的元素类型与赋值的三态值不匹配:
正确赋值三态值
如果Grid::idarray_t的元素类型本身就是boost::tribool,改用boost提供的标准赋值方式:// 两种写法任选其一 id[c] = boost::tribool(boost::indeterminate); // 或更简洁的 id[c] = boost::indeterminate;直接用枚举值
indeterminate_value会触发编译器对“枚举值转布尔”的严格检查,而用boost提供的构造/赋值方式可以规避这个问题。修正类型定义(根本解决)
如果Grid::idarray_t的元素类型是普通bool,那设计本身存在矛盾——普通布尔类型只能存储true/false,无法容纳三态值。这种情况下需要修改Grid::idarray_t的定义,将元素类型改为boost::tribool,才能正确适配三态逻辑。临时规避警告(不推荐)
若项目编译脚本强制开启了-Werror=int-in-bool-context,可以尝试在编译参数中移除这个警告转错误的规则,但这只是治标不治本的方法,不建议长期使用。
内容的提问来源于stack exchange,提问作者Natalia Sá
相关产品推荐
相关产品推荐

