假设我有一个类型为
的地图std::map<int, Node> G;
节点如下
struct Node{
Node(){};
int data;
};
我想使用operator []返回对节点的引用(如果它在地图中),或者创建一个新节点并返回引用(如果不是)。这是我对文档所说内容的理解:
如果k匹配容器中元素的键,则该函数返回对其映射值的引用。
如果k与容器中任何元素的键不匹配,则该函数会使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也总是会将容器大小增加1。
但是,以下代码会引发错误(g ++ 5,std = gnu ++ 11):
错误:无法在赋值时将'std :: map :: mapped_type {aka Node}'转换为'Node *'u_ptr = G [3];
Node* u_ptr;
u_ptr = G[3];
在我见过的所有例子中,G[k]
出现在lhs上。 rhs上不允许G[k]
吗?如果没有,为什么?
答案 0 :(得分:5)
d3.stack()
会返回std::map<Key, T>::operator[]
引用。
在这种情况下,T&
为T
,因此Node
会返回G[3]
引用,然后您尝试将其分配给Node&
指针。这就是您收到编译器错误的原因。
所以,你可以:
将Node*
更改为参考:
u_ptr
使用Node& u_ptr = G[3];
地址运算符将引用转换为指针:
&