无法将 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= 同样更改参数。

您有两个问题:

  1. 您正在通过 non-const 引用将启动器列表传递给 Storage() 构造函数。
  2. 您尚未定义 Storage(int) 构造函数。

这应该可以解决两个问题:

Storage(std::initializer_list<T> const& list)
    : nrOfEl( static_cast<int>(list.size()) )
{ ... }

除其他答案外的注释:没有理由通过 const& 传递 std::initializer_list,它只是一对指针(或指针和大小)。您可以按值传递它,就像在标准库中所做的那样。