Как сделать мой & quot; собственный & quot; шаблонная карта?

Я хочу реализовать свой собственный «простой» контейнер, который будет иметь свойства карты, но также будет сохранять порядок вставки. Я слышал о boost :: multi_index, но мне очень трудно понять, чего я хочу.

Итак, я сделал шаблонный класс:

template<typename KEY, typename VALUE>
class MyMap {
private :
std::vector<KEY>    m_keys;
std::vector<VALUE>  m_values;

public :
void insert(KEY& key, VALUE& val) {
//Test if key exists //
m_keys.push_back(key);
m_values.push_back(val);
}

/* Other methods like erase/size/operator[]/begin/etc. */

};

Просто чтобы проверить это, я хотел сделать что-то вроде этого:

int main() {
MyMap<string,int> m;
m.insert("test",1);
m.insert("cat",2);

for(auto& item : m) {
cout << item << endl;
cout << m[item] << endl;
}
}

Но я продолжаю получать ошибку компиляции на вставках (и []), так как это переводит мой KEY в basic_string, а не в строку. Это сводит меня с ума, и я не могу найти никакого ответа (или любое слово, чтобы правильно описать мою проблему, чтобы найти ответ). Я думаю, это как-то связано с распределителями, но я не могу понять, как это исправить.
Как я могу сделать так, чтобы моя карта выполняла это преобразование, но при этом оставалась общей, так как она понадобится другим классам (реализованным самостоятельно)?

РЕДАКТИРОВАТЬ : После решения проблемы «string» у меня возникли проблемы при передаче int, потому что он ожидал &внутр. Следовал советам кебов и реализовал вектор> вместо этого и избавился от проблем с конвертацией … 🙂

0

Решение

Вы не можете создать ссылку из const char* (даже если он преобразуется в строку), попробуйте вместо этого:

    template<typename KEY, typename VALUE>
void insert(KEY key, VALUE val) {
m_keys.push_back(key);
m_values.push_back(val);
}

Точнее говоря, компилятор довольно ясно понимает проблему:

ошибка: неверная инициализация неконстантной ссылки типа ‘std :: basic_string&’из значения типа’ std :: basic_string ‘
m.insert ( «тест», 1);

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]