#c #hash #unordered-map
#c #хэш #неупорядоченное сопоставление
Вопрос:
У меня есть простой код, в котором определены четыре переменные Node
типа и две Edge
переменные типа, и создается неупорядоченная карта для сопоставления начальных ребер с их конечными ребрами. Однако Visual Studio 2015 Professional жалуется на следующую проблему:
The C Standard doesn't provide a hash for this type.
Не могли бы вы, пожалуйста, помочь мне, как решить эту проблему? Мой небольшой код (который является MWE, поэтому первоначальная цель была иной, чем введение такой глупой карты) заключается в следующем:
#include<string>
#include<vector>
#include<unordered_map>
#include<iostream>
using namespace std;
class Node
{
public:
Node(){};
string label;
};
class Edge
{
public:
Edge(){};
Node *start, *end;
};
int main()
{
Edge* edge;
Node* node;
vector<Node*> nodes;
vector<Edge*> edges;
unordered_map<Node*,Edge*> n2e;
edge = new Edge();
edges.push_back(edge);
node = new Node();
node->label = "A";
edge->start = node;
nodes.push_back(node);
node = new Node();
node->label = "B";
edge->end = node;
nodes.push_back(node);
edge = new Edge();
edges.push_back(edge);
node = new Node();
node->label = "C";
edge->start = node;
nodes.push_back(node);
node = new Node();
node->label = "D";
edge->end = node;
nodes.push_back(node);
n2e[nodes[0]] = edges[0];
n2e[nodes[2]] = edges[1];
cout << n2e[nodes[0]]->start->label << " " << n2e[nodes[0]]->end->label << endl;
cout << n2e[nodes[2]]->start->label << " " << n2e[nodes[2]]->end->label << endl;
return 0;
}
Комментарии:
1. Это скомпилировано для меня в VS2015 путем замены
#include <stdio.h>
(которая не нужна afaict) на#include <string>
отсутствовавшую (она также компилируется с g )2. @Borgleader, спасибо за проверку этого кода. Я также могу скомпилировать его с помощью g под Linux. Итак, я проверю исходный код и попытаюсь выяснить, что вызывает ошибку.
3. Поскольку вы не указываете хэш-класс для своего
unordered_map
, он будет использоватьstd::hash<Node*>
, который вы также не определяете. Включение<string>
, скорее всего, включает некоторую форму хэша, которая работает со значением указателя , а не с тем, на что указывает указатель, поэтому хэш, который вы получаете, вероятно, не тот, который вы хотели бы.