我正在尝试使用“使用 C++ 的编程原则和实践”第 18 章中给出的代码来实现容器类。当我使用 initializer_list 编写初始化代码时,出现此错误:“从‘::size_t’到‘int’的转换需要缩小转换”。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
class vector
{
public:
vector(int s)
:sz{ s },
elem{ new double[sz] }
{
for (int i = 0; i < sz; i++)
elem[i] = 0.0;
}
vector(std::initializer_list<double>lst)
:sz{ lst.size() }, elem{ new double[sz] }
{ //compiler points to here for the error
std::copy(lst.begin(), lst.end(), elem);
}
~vector() { delete[] elem; }
int size() const { return sz; }
double get(int n) const { return elem[n]; }
void set(int n, double d) { elem[n] = d; }
private:
int sz;
double* elem;
};
最佳答案
您正在尝试转换 size_t
进入 int
.假设 32 位,size_t
最多可以容纳 2^32 因为它是无符号的,而 int
只能容纳 2^31(因为它也可以有负值)。
当你这样做时:
vector(std::initializer_list<double>lst)
:sz{ lst.size() }
如果lst.size()
大于 int
存储的值,则无法正确存储该值。解决方案是只使用 std::vector
在内部,并摆脱 sz
成员(member),但看起来好像您正在尝试制作自己的 vector
类,你应该做 sz
一个size_t
,因为它更好地代表了您正在尝试做的事情。毕竟,这不像是你的 vector
可以有< 0
其中的元素。
关于c++ - 从 '::size_t' 到 'int' 的转换需要缩小转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49703777/