转换自' :: size_t'到' int'需要缩小转换

时间:2018-04-07 04:16:09

标签: c++

我尝试使用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;
};

1 个答案:

答案 0 :(得分:2)

您正试图将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元素。