C ++, как использовать emplace_back для определенной пользователем структуры - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь использовать emplace_back для моей пользовательской структуры:

#include <cstdint>
#include <vector>
#include <string>

struct IDNumber
{
    IDNumber(std::vector<int> d) : id(d){}
    std::vector<int> id;
};
struct Def
{
    Def(std::initializer_list<int> id) : mid(id){}
    IDNumber mid;
};

struct Student
{
    std::vector<Def> ent;
};

int main()

{
 Student a;
 a.ent.emplace_back({ {2000} });
}

У меня возникают проблемы с компиляцией:

error: no matching function for call to 'std::vector<EntryDef>::emplace_back'

1 Ответ

0 голосов
/ 14 ноября 2018

Комментарий от @ PiotrSkotnicki :

emplace_back - это шаблон функции, который пытается определить типы аргументов.список инициализаторов не имеет типа, поэтому вывод не выполняется.

Разъясняет проблему.

Альтернативный способ «исправить» эту проблему - передать rvalue нужного типав качестве аргумента конструктора, вместо списка инициализатора:

EntryDef(ID &&id, FType ft, … ) : mid(std::forward<ID>(id)), ftype(ft), … {}

Вызывается как:

Def a;
a.ent.emplace_back(ID{ 2, 1 }, FType::FD_NONE, …);

Живой пример ЗДЕСЬ .

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