std::initializer_list::size_type 的 static_cast<int> 吐出 "invalid conversion" 错误
static_cast<int> of std::initializer_list::size_type spits out "invalid conversion" error
我正在研究 BS 的“C++ 之旅”,并且正在重新创建他在整个过程中使用的 Vector
class,至少是前四章。
我在使用 std::initializer_list
构建 Vector
构造函数的第二个版本时遇到了障碍。 static_cast<int>
用于将 size_type
转换为 int
,因此可以初始化我的 Vector
的 sz
。
但是,由于某种原因,当我尝试在我的个人计算机和 OnlineGDB 上编译它时,出现错误:
main.cpp: In constructor 'Vector::Vector(std::initializer_list<double>)':
main.cpp:24:58: error: invalid conversion from ‘std::initializer_list::size_type {aka long unsigned int}’ to ‘double*’ [-fpermissive]
: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;
}
我正在研究 BS 的“C++ 之旅”,并且正在重新创建他在整个过程中使用的 Vector
class,至少是前四章。
我在使用 std::initializer_list
构建 Vector
构造函数的第二个版本时遇到了障碍。 static_cast<int>
用于将 size_type
转换为 int
,因此可以初始化我的 Vector
的 sz
。
但是,由于某种原因,当我尝试在我的个人计算机和 OnlineGDB 上编译它时,出现错误:
main.cpp: In constructor 'Vector::Vector(std::initializer_list<double>)': main.cpp:24:58: error: invalid conversion from ‘std::initializer_list::size_type {aka long unsigned int}’ to ‘double*’ [-fpermissive] :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;
}