Почему я получаю ошибку наложения при использовании .pushback для вектора, заключенного в вектор - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь создать таблицу ha sh с вектором внутри вектора из структуры. v[1].push_back(value); выдает ошибку:

error C2664: 'void std::vector<node,std::allocator<node>>::push_back(_Ty &&)': cannot convert argument 1 from 'int' to 'const _Ty &'
        with
        [
            _Ty=node
        ]
note: Reason: cannot convert from 'int' to 'const _Ty'
        with
        [
            _Ty=node
        ]
note: No constructor could take the source type, or constructor overload resolution was ambiguous

Вот мой код: struct node {int data;

node() {
    data = 0;
}
};

class hashmap {
public:
vector<vector<struct node>> v;
vector<struct node> n;

hashmap() {
    for (int i = 0; i < 5; i++) {
        v.push_back(n);
    }
}


void insert(int key, int value) {
    int index = Hashfunction(key);
    v[1].push_back(value);

}

int Hashfunction(int key) {
    int index = key % v.size();
    return index;
}



};

1 Ответ

0 голосов
/ 19 марта 2020

Всегда смотрите полное сообщение об ошибке, современные компиляторы, как правило, очень полезны. В этом случае ключевая информация: cannot convert from 'int' to 'const _Ty' with _Ty=node, которая при замене шаблона типа дает cannot convert from 'int' to 'const node'. Это не связано с наличием вложенных векторов. Вы увидите ту же ошибку со следующим кодом:

struct node {
    int data;

    node() {
        data = 0;
    }
};

vector<struct node> n;
n.push_back(1);

Ошибка заключается в том, что компилятор не может преобразовать int в node. Исправление заключается в предоставлении конструктора, который принимает int:

struct node {
    int data;

    node()
    : data(0)
    {
    }

    node(int value)
    : data(value)
    {
    }
};

Обратите внимание на использование инициализаторов, а не на присваивание членам в теле конструктора, это создает более эффективный код.

В идеале конструкторы, принимающие один аргумент, должны быть помечены explicit, чтобы помочь предотвратить такие проблемы, как неоднозначности:

struct node {
    int data;

    node()
    : data(0)
    {
    }

    explicit node(int value)
    : data(value)
    {
    }
};

Обратите внимание, что вам нужно немного изменить свой вызов push_back, чтобы явно создать node:

v[1].push_back(node(value));

или чуть более эффективный и менее набирающий:

v[1].emplace_back(value)
...