Невозможно преобразовать initializer_list в класс <int> - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь initialize_list для шаблона класса.Я довольно новичок, и у меня были некоторые проблемы с этим.Ошибка в 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 ]

1 голос
/ 18 мая 2019

У вас есть две проблемы:

  1. Вы передаете список инициализаторов по неконстантной ссылке в конструктор Storage ().
  2. Вы не определили Storage (int)Конструктор.

Это должно исправить оба:

Storage(std::initializer_list<T> const& list)
    : nrOfEl( static_cast<int>(list.size()) )
{ ... }
1 голос
/ 18 мая 2019

В main() ваш список инициализаторов создается как r-значение, поэтому передача по ссылке не удастся. Переход по 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=.

0 голосов
/ 18 мая 2019

Примечание в дополнение к другим ответам: нет смысла передавать std::initializer_list на const&, это просто пара указателей (или указатель и размер). Вы можете передать его по значению, как это делается в стандартной библиотеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...