首页 > 解决方案 > static_caststd::initializer_list::size_type 吐出“无效转换”错误

问题描述

我正在阅读 BS 的“A Tour of C++”,并且正在重新创建Vector他自始至终使用的课程,至少是前四章。

Vector我在构建构造函数的第二个版本时遇到了问题std::initializer_list。Astatic_cast<int>用于将 转换为我可以初始化size_typeintso 。szVector

但是,由于某种原因,当我尝试在我的个人机器和 OnlineGDB 上编译它时,我收到一个错误:

main.cpp:在构造函数'Vector::Vector(std::initializer_list<double>)'中:
main.cpp:24:58:错误:从 'std::initializer_list::size_type {aka long unsigned int}' 到 'double*' [-fpermissive] 的无效转换
     :elem{lst.size()}, sz{static_cast<int>(lst.size())}
                                                          ^

为什么要尝试将其转换size_type为 a double*?它不应该简单地将其转换为常规int吗?

请参阅我在下面的最小可重现示例中的尝试。

#include <algorithm>
#include <initializer_list>

class Vector{
    double* elem;                             
    int sz;                                 
public:
    Vector(std::initializer_list<double> lst)
    :elem{lst.size()},  sz{static_cast<int>( lst.size() )}
    {
        std::copy(lst.begin(), lst.end(), elem);
    }
};

int main()
{
    Vector vec = {1.2, 1.3, 1.4};
    return 0;
}

标签: c++vectorstlstatic-caststdinitializerlist

解决方案


在这里,您正在使用 aelem{lst.size()}初始化a 。double*size_t

你为什么这样做static_cast<int>( lst.size() )?您的尺寸应与列表的尺寸类型相同,即size_t,以避免出现负尺寸。

这是经过一些编辑后的代码:

#include <initializer_list>
#include <algorithm>
#include <iostream>

class Vector{
    size_t sz;
    double* elem;
public:
    Vector(std::initializer_list<double> lst)
            :sz{lst.size()},  elem{new double [sz]}
    {
        std::copy(lst.begin(), lst.end(), elem);
    }
    Vector(const Vector&) = delete ;
    Vector& operator=(const Vector &) = delete ;
    size_t size()const{
        return sz;
    }
    double& operator[](size_t i){
        return elem[i];
    }
    ~Vector(){ delete [] elem;}
};

int main()
{
    Vector vec={1.2,1.3,1.4};
    for(size_t i{}; i < vec.size(); ++i)
        std::cout << vec[i] << " ";
    return 0;
}

居住


推荐阅读