<int> 标准static_cast::initializer_list::size_type 吐出"invalid conversion"错误



我正在处理"C++之旅";通过BS,我正在重新创建他贯穿始终使用的Vector类,至少在前四章中是这样。

我在使用std::initializer_list构建Vector构造函数的第二个版本时遇到了一个障碍。static_cast<int>用于将size_type转换为int,因此可以初始化我的Vectorsz

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

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

为什么要将size_type转换为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;
}

elem{lst.size()}中,您正在使用size_t初始化double*

为什么要做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;
}

实时

最新更新