无法将initializer_list转换为class <int>

时间:2019-05-18 14:24:33

标签: c++ templates initializer-list stdinitializerlist

我正在尝试为类模板初始化列表。我是一个新手,为此遇到了一些麻烦。 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:“正在初始化”:无法从“初始化列表”转换为“存储”

注意:没有构造函数可以采用源类型,或者构造函数重载分辨率不明确

3 个答案:

答案 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)

您有两个问题:

  1. 您正在通过非常量引用将initiiliazer列表传递到Storage()构造函数中。
  2. 您尚未定义Storage(int)构造函数。

这应该同时解决两个问题:

#!/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&,它只是一对指针(或一个指针和一个大小)。您可以按值传递它,就像在标准库中一样。