1

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

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

4

3 回答 3

2

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

于 2019-05-18T15:11:48.800 回答
1

main()中,您的初始值设定项列表构造为 r 值,因此传递引用将失败。但是,通过 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=

于 2019-05-18T14:33:04.653 回答
1

你有两个问题:

  1. 您通过非常量引用将初始化程序列表传递给 Storage() 构造函数。
  2. 您尚未定义 Storage(int) 构造函数。

这应该解决两个问题:

Storage(std::initializer_list<T> const& list)
    : nrOfEl( static_cast<int>(list.size()) )
{ ... }
于 2019-05-18T14:50:08.050 回答