我有一个这样的课程:
class A {
void init(int a){
_data.resize(a); //! (1)
}
//other parts of the code are not important ...
private:
std::list<std::vector<double>> _data;
}
在(1)中我收到了警告:
implicit conversion from int to size_type(aka unsigned long)
我想知道摆脱警告的正确方法是什么? 也许是这样的:
_data.resize(static_cast<decltype(_data)::size_type>(a)
注意:我想代码应该更改为:
init(size_t a)
但是我们假设我们无法改变类接口。
答案 0 :(得分:7)
您的示例演员以正确的方式执行:
_data
类型更改。如果改变界面是不可能的,那么坚持下去。
在您使用输入之前添加健全性检查会很好。在将其转换为unsigned之前检查负值是最基本和最有用的。
答案 1 :(得分:4)
最正确的方法就是你说:
_data.resize(static_cast<decltype(_data)::size_type>(a));
但是最大的问题是签名 vs unsigned
,你说你被int
所困,所以你使用:
_data.resize(static_cast<unsigned int>(a));
答案 2 :(得分:2)
这很简单:
_data.resize(std::size_t(a));
像这样疯狂:
_data.resize(static_cast<std::size_t>(a));
还支持C风格的演员阵容:
_data.resize((std::size_t)a);