假设我的结构为value
struct Friend { Person * a, Person* b}
然后我有另一个班级key
class Relation;
现在我想创建一个键值关系
std::unordere_map<Relation*, Friend> my_map;
我试过了
Relation* r;
Person * p1;
Person * p2;
my_map[r] = {p1, p2}; // works
my_map[r] = new Friend(p1,p2); // does not work
// error says : error: no match for 'operator='
// my_map[r] = Friend(p1, p2); /// also does not work
// After Edit from Zan
// error: no matching function for call to 'Friend::Friend()'
struct Friend {
Friend(Person* x, Person* y){
a = x;
b = y;
}
Person * a;
Person* b;
}
答案 0 :(得分:2)
Friend != Friend*
。如果您声明std::unordered_map
的值为Friend
,那么您就无法使用Friend*
而反之亦然。
但我不知道你想要做什么。这听起来像是一个XY问题。 Relation
班级的目的是什么?它只是表达Person*
a
和b
之间的关系?如果是这种情况,则数据结构不适合您的目的。
使用std::unordered_map<Relation*, Friend>
您使用指针作为键但管理Relation
的内存?谁拥有它?
也许您只需要std::unordered_map<Person*, Person*>
来存储相互关系,或std::set<Friend>
如果您想要交易性能以避免存储传递条目。
答案 1 :(得分:2)
没有人真正解决过你的错误。我假设你的注释错误在这里:
// my_map [r] =朋友(p1,p2); ///也不起作用 //错误:没有匹配函数来调用'A :: A()'
来自之前的代码,而A::A()
实际上是Friend::Friend()
。该错误的含义是my_map[r]
必须首先创建默认的Friend
值才能执行任何其他操作。 operator[]
函数必须能够返回对它的引用。
如果您定义一个默认构造函数,将Person*
值设置为NULL或nullptr或0,那么您的代码将开始工作,除了已经指出的其他问题。
不要担心这里的表现。在优化中,编译器将看到值写入0然后写入实际值而不会被读取,它将删除第一次写入0。
答案 2 :(得分:0)
尝试删除新内容。您正试图在地图而不是朋友中存储朋友*。如果你跳过了新的,它应该在堆栈中创建一个,然后将其移动到地图中。