从'::size_t'转换为'int'需要缩小转换范围

conversion from '::size_t' to 'int' requires a narrowing conversion

本文关键字:转换 int 缩小 范围 size      更新时间:2023-10-16

我正在尝试使用"使用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成员,但看到它看起来好像你正在尝试制作自己的vector类,你应该只sz做一个size_t,因为它更好地代表了你想要做的事情。毕竟,并不是说你的vector可以有< 0元素。