c++ - static_caststd::initializer_list::size_type 吐出“无效转换”错误
问题描述
我正在阅读 BS 的“A Tour of C++”,并且正在重新创建Vector
他自始至终使用的课程,至少是前四章。
Vector
我在构建构造函数的第二个版本时遇到了问题std::initializer_list
。Astatic_cast<int>
用于将 转换为我可以初始化size_type
的int
so 。sz
Vector
但是,由于某种原因,当我尝试在我的个人机器和 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;
}
解决方案
在这里,您正在使用 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;
}
推荐阅读
- c - `int main(i){ printf("i = %d\n", i); }` 我的值为 1。为什么?请解释?
- python - 在列表中添加某些元素
- python-3.x - 有没有一种简单的方法来压缩这段代码?
- c# - do-while 循环(计算器)net.framework 的问题
- node.js - 有没有办法使用 spotify 的 API 获取当前播放时间
- google-cloud-platform - 如何通过 API 获取所有可用镜像的信息以创建 vm 实例
- javascript - 在javascript中将纯文本转换为超链接
- cassandra - 在不停机的情况下添加新的 Cassandra 节点
- laravel - Laravel - 模型类型的多态关系
- c# - 如何在c#winforms中取消停靠和分离停靠在另一个窗体中的窗体