Я не могу понять, почему мне не удается напрямую инициализировать вектор, используя следующий синтаксис:
stl::vector<int> v{1, 2, 3};
Я реализовал с нуля классы вектора и списка инициализаторов.
Конструктор вектора (есть также конструктор по умолчанию, который просто устанавливает все в 0):
vector(initializer_list<T> init) : m_capacity(init.size()), m_size(m_capacity), m_data(nullptr)
{
this->m_data = (T *)malloc(m_size * sizeof(T));
if (this->m_data == nullptr)
throw "malloc: Couldn't allocate memory!\n";
memcpy(m_data, init.begin(), m_size * sizeof(T));
}
Это мой класс инициализатора_списка:
template <typename T> class initializer_list
{
public:
typedef const T* const_iterator;
typedef T* iterator;
private:
iterator m_begin;
size_t m_size;
constexpr initializer_list(const_iterator it, size_t size) noexcept : m_begin(it), m_size(size) { }
public:
constexpr initializer_list() noexcept : m_begin(nullptr), m_size(0) { }
constexpr const_iterator begin() const { return m_begin; }
constexpr const_iterator begin(initializer_list<T> init) noexcept { return init.begin(); }
constexpr const_iterator end() const { return m_begin + m_size; }
constexpr const_iterator end(initializer_list<T> init) noexcept { return init.end(); }
constexpr size_t size() const { return m_size; }
};
Я создал отдельный конструктор в классе векторов, который принимает список инициализаторов в качестве параметра. Однако я получаю следующую ошибку:
no instance of constructor "stl::vector<T>::vector [with T=int]" matches the argument list
Не говоря уже о том, что ваш собственный список инициализаторов на самом деле не имеет места для хранения данных, которые он должен обернуть, или способа получить необходимые данные откуда угодно. Каково ваше фактическое задание? Какую основную проблему вам необходимо решить? Как вы думаете, почему нужно реализовывать свои варианты стандартных контейнеров?
Если придираться, «STL» — это Стандартная библиотека шаблонов, которая послужила источником вдохновения для создания первой стандартной библиотеки. Но STL — это не то же самое, что стандартная библиотека.
Это не минимальный воспроизводимый пример . Всегда публикуйте код, воспроизводящий проблему/ошибку, о которой вы заявляете. Нет stl::vector
но std::vector
. Скорее всего, у вас есть собственное пространство имен strl
. Поэтому публикуйте реальный/реальный код вместо вырезанных фрагментов вашего кода.
std::initializer_list
— это магический тип, который невозможно реализовать с помощью пользовательского кода.
Особое поведение разрешения перегрузки и списки инициализаторов в скобках работают только специально для этого магического типа std::initializer_list
.
Вы не можете определить свой собственный initializer_list
и надеяться, что он будет работать как std::initializer_list
.
Вы также не сможете заставить работать синтаксис stl::vector<int> v{1, 2, 3};
без использования std::intializer_list
. Нет никакого способа обойти его использование. Синтаксис не может быть достигнут каким-либо другим способом.
Кстати, в стандартной библиотеке есть множество этих магических типов и функций. Некоторые из них просто невозможно реализовать в пользовательском коде, и вместо этого им приходится полагаться на встроенные функции компилятора. Но некоторые, такие как std::initializer_list
, также имеют особое значение для самого компилятора и даже не могут быть воспроизведены с помощью встроенных функций компилятора.
Это не работает, потому что для использования
std::initializer_list
указано использование списков инициализаторов, а не вашей собственной реализации.