Присвоение unordered_map для пары объектов - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь понять назначение unordered_map, я получаю следующую ошибку: нет соответствующей функции для вызова std::pair<foo, foo>::pair(), в соответствии с do c для unordered_map operator[]:

Если k не соответствует ключу какого-либо элемента в контейнере, функция вставляет новый элемент с этим ключом и возвращает ссылку на его сопоставленное значение.

Поэтому я пытаюсь назначить объект (от make_pair) до этой ссылки, которая, как я предполагаю, не допускается. Однако с pair<int,int> это работает, и мне интересно, должен ли я объявить некоторые другие операторы для foo, чтобы это работало.

#include <bits/stdc++.h>
using namespace std;

struct foo {
  int n;
  foo(int n): n(n) {};
};

int main(){
  unordered_map<int, pair<foo,foo>> m;
  //m[3] = make_pair(foo(1),foo(2));         <--- error here

  unordered_map<int, pair<int,int>> ii;
  ii[3] = make_pair(1,2);
}

1 Ответ

1 голос
/ 20 марта 2020

Проблема в том, что operator [] может потребоваться создать объект значения, в вашем случае std::pair<foo, foo>. Поскольку foo не имеет конструктора по умолчанию, он не может создать конструктор по умолчанию std::pair.

Вы можете предоставить конструктор по умолчанию для foo (включая добавление значения по умолчанию для n ), или вам придется использовать другой метод для вставки значений в m.

...