Инициализация вектора с данными не работает - push_back () работает - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь создать вектор typedefs. Всякий раз, когда я пытаюсь инициализировать вектор одним из этих typedef, он выдает ошибку no instance of constructor.

typedef определяется следующим образом:

typedef palam::geometry::Pt2<uint16_t> CPoints;

, и я пытаюсь инициализировать вектор, как это:

CPoints point1(10, 15);
CPoints point2(15, 20);
std::vector<CPoints> points(point1, point2);

но это не работает. Я могу обойти эту проблему, инициализируя вектор значением NULL, а затем используя функцию push_back(), например

CPoints point1(10, 15);
CPoints point2(15, 20);
std::vector<CPoints> points(NULL);
points.push_back(point1);
points.push_back(point2);

Эта работа кажется немного грязной, и я уверен, должен быть лучший способ go об этом. Кто-нибудь знает, почему я не могу напрямую инициализировать вектор с помощью typedefs?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

Этот фрагмент:

std::vector<CPoints> points(point1, point2);

вызывает конструктор vector , принимая 2 аргумента. Если вы хотите инициализировать vector с несколькими элементами, используйте {}, например:

std::vector<CPoints> points {point1, point2};

Это вызывает перегрузку с номером 9, которая принимает список инициализатора.

0 голосов
/ 17 апреля 2020

Используйте эту запись

std::vector<CPoints> points = { point1, point2 };

Или это

std::vector<CPoints> points { point1, point2 };

или это

std::vector<CPoints> points( { point1, point2 } );

То есть используйте список инициализатора, если вы хотите указать несколько объектов одновременно к вектору.

В противном случае компилятор пытается применить один из этих конструкторов

vector(size_type n, const T& value, const Allocator& = Allocator());
template <class InputIterator>
vector(InputIterator first, InputIterator last,
const Allocator& = Allocator());

, которые недопустимы для указанных аргументов в объявлении

std::vector<CPoints> points(point1, point2);
...