我正在尝试为类模板初始化列表。我是一个新手,为此遇到了一些麻烦。 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;
}
错误C2440:“正在初始化”:无法从“初始化列表”转换为“存储”
注意:没有构造函数可以采用源类型,或者构造函数重载分辨率不明确
答案 0 :(得分:1)
在main()
中,您的初始值设定项列表被构造为r值,因此按引用传递将失败。但是,通过const-reference传递将起作用。您应该允许构造函数接受const引用列表:
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=
更改参数。
答案 1 :(得分:1)
您有两个问题:
这应该同时解决两个问题:
#!/bin/bash
while read -sN1 key # 1 char (not delimiter), silent
do
# catch multi-char special key sequences
read -sN1 -t 0.0001 k1
read -sN1 -t 0.0001 k2
read -sN1 -t 0.0001 k3
key+=${k1}${k2}${k3}
case "$key" in
$'\e[A'|$'\e0A') # cursor up,: previous item
((cur > 1)) && ((cur--))
echo up;;
$'\e[D'|$'\e0D') # left
((cur > 1)) && ((cur--))
echo left;;
$'\e[B'|$'\e0B') # cursor down: next item
((cur < $#-1)) && ((cur++))
echo down;;
$'\e[C'|$'\e0C') # right: next item
((cur < $#-1)) && ((cur++))
echo right;;
$'\e[1~'|$'\e0H'|$'\e[H') # home: first item
cur=0
echo home;;
$'\e[4~'|$'\e0F'|$'\e[F') # end: last item
((cur=$#-1))
echo end;;
' ') # space: mark/unmark item
array_contains ${cur} "${sel[@]}" && \
sel=($(array_remove $cur "${sel[@]}")) \
|| sel+=($cur);;
q|'') # q, carriage return: quit
echo "${sel[@]}" && return;;
esac
done
答案 2 :(得分:0)
除其他答案外的注释:没有理由用std::initializer_list
传递const&
,它只是一对指针(或一个指针和一个大小)。您可以按值传递它,就像在标准库中一样。