无法将 initializer_list 转换为 class<int>
Cannot convert initializer_list to class<int>
我正在尝试 initialize_list 获取 class 模板。我是一个新手,在这方面遇到了一些麻烦。 main()
出错
#include <iostream>
#include <initializer_list>
#include <stdexcept>
template <class T>
class Storage
{
private:
int nrOfEl{ 0 };
T *m_array{};
public:
//...
Storage(std::initializer_list<T>& list)
: Storage( static_cast<int>(list.size()) )
{
int count{ 0 };
for (auto& element : list)
{
m_array[count] = element;
++count;
}
}
~Storage()
{
std::cout << "\nCalling ~Storage()\n";
delete[] m_array;
}
T& operator[](const int &index)
{
if (index >= nrOfEl || index < 0)
throw std::out_of_range("OUT OF BOUNDS");
return *m_array[index];
}
Storage& operator=(std::initializer_list<T>& list)
{
int length{ static_cast<int>(list.size()) };
if (length != nrOfEl)
{
delete[] m_array;
nrOfEl = length;
m_array = new int[length];
}
int count = 0;
for (int element : list)
{
m_array[count] = element;
++count;
}
return *this;
}
//...
};
int main()
{
Storage<int> ints { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
//error here
return 0;
}
error C2440: 'initializing': 无法从 'initializer list' 转换为 'Storage'
注意:没有构造函数可以采用源类型,或者构造函数重载解析不明确
在 main()
中,您的初始化列表构造为 r-value,因此 pass-by-reference 将失败。但是,通过 const-reference 将起作用。您应该允许构造函数接受 const-reference 列表:
Storage(const std::initializer_list<T>& list)
// ^^^^^
: Storage( static_cast<int>(list.size()) )
{
int count{ 0 };
for (const auto& element : list) // const here too
{
m_array[count] = element;
++count;
}
}
您还应该用 operator=
同样更改参数。
您有两个问题:
- 您正在通过 non-const 引用将启动器列表传递给 Storage() 构造函数。
- 您尚未定义 Storage(int) 构造函数。
这应该可以解决两个问题:
Storage(std::initializer_list<T> const& list)
: nrOfEl( static_cast<int>(list.size()) )
{ ... }
除其他答案外的注释:没有理由通过 const&
传递 std::initializer_list
,它只是一对指针(或指针和大小)。您可以按值传递它,就像在标准库中所做的那样。
我正在尝试 initialize_list 获取 class 模板。我是一个新手,在这方面遇到了一些麻烦。 main()
出错#include <iostream>
#include <initializer_list>
#include <stdexcept>
template <class T>
class Storage
{
private:
int nrOfEl{ 0 };
T *m_array{};
public:
//...
Storage(std::initializer_list<T>& list)
: Storage( static_cast<int>(list.size()) )
{
int count{ 0 };
for (auto& element : list)
{
m_array[count] = element;
++count;
}
}
~Storage()
{
std::cout << "\nCalling ~Storage()\n";
delete[] m_array;
}
T& operator[](const int &index)
{
if (index >= nrOfEl || index < 0)
throw std::out_of_range("OUT OF BOUNDS");
return *m_array[index];
}
Storage& operator=(std::initializer_list<T>& list)
{
int length{ static_cast<int>(list.size()) };
if (length != nrOfEl)
{
delete[] m_array;
nrOfEl = length;
m_array = new int[length];
}
int count = 0;
for (int element : list)
{
m_array[count] = element;
++count;
}
return *this;
}
//...
};
int main()
{
Storage<int> ints { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
//error here
return 0;
}
error C2440: 'initializing': 无法从 'initializer list' 转换为 'Storage'
注意:没有构造函数可以采用源类型,或者构造函数重载解析不明确
在 main()
中,您的初始化列表构造为 r-value,因此 pass-by-reference 将失败。但是,通过 const-reference 将起作用。您应该允许构造函数接受 const-reference 列表:
Storage(const std::initializer_list<T>& list)
// ^^^^^
: Storage( static_cast<int>(list.size()) )
{
int count{ 0 };
for (const auto& element : list) // const here too
{
m_array[count] = element;
++count;
}
}
您还应该用 operator=
同样更改参数。
您有两个问题:
- 您正在通过 non-const 引用将启动器列表传递给 Storage() 构造函数。
- 您尚未定义 Storage(int) 构造函数。
这应该可以解决两个问题:
Storage(std::initializer_list<T> const& list)
: nrOfEl( static_cast<int>(list.size()) )
{ ... }
除其他答案外的注释:没有理由通过 const&
传递 std::initializer_list
,它只是一对指针(或指针和大小)。您可以按值传递它,就像在标准库中所做的那样。