C++访问boost multi_arrays维度时的类型转换警告处理
问题解答
警告含义
你收到的警告确实对应隐式类型转换行为:
boost::multi_array的shape()方法返回的元素类型是容器内置的size_type,根据警告提示该类型的实际别名是long unsigned int,你直接将其赋值给int类型的nrows、ncols变量,属于隐式的无符号类型转有符号类型、大范围数值转小范围数值,编译器担心数值超出int的取值范围后会发生值截断,因此抛出该警告。
显式转换及解决方案
你可以根据业务场景选择以下任意一种方案解决警告:
- 方案1:确定矩阵尺寸不会超过int上限(如常规图像尺寸远小于int最大值2^31-1),直接用
static_cast做显式转换即可
#include <boost/multi_array.hpp> void function (boost::multi_array<unsigned char, 2> matrix) { int nrows = static_cast<int>(matrix.shape()[0]); int ncols = static_cast<int>(matrix.shape()[1]); }
- 方案2:需要保证极端场景下的程序稳定性,可先做边界校验再转换
#include <boost/multi_array.hpp> #include <stdexcept> #include <climits> void function (boost::multi_array<unsigned char, 2> matrix) { auto row_size = matrix.shape()[0]; auto col_size = matrix.shape()[1]; if (row_size > INT_MAX || col_size > INT_MAX) { throw std::runtime_error("矩阵尺寸超出int类型可表示的最大范围"); } int nrows = static_cast<int>(row_size); int ncols = static_cast<int>(col_size); }
- 方案3:后续计算无需强制使用int类型,直接用匹配的类型存储尺寸,无需转换即可消除警告
#include <boost/multi_array.hpp> void function (boost::multi_array<unsigned char, 2> matrix) { // 自动推导为对应size_type类型 auto nrows = matrix.shape()[0]; auto ncols = matrix.shape()[1]; }
内容的提问来源于stack exchange,提问作者jelc
相关产品推荐
相关产品推荐

