C ++成员参考基本类型'Vertex * const'不是结构或联合

Max*_*ard 2 c++ iterator const reference vector

尝试访问存储在向量中的对象的方法时遇到麻烦。我知道getEdges返回边缘的无序贴图,但是我缺少关于如何从向量中引用Vertex对象的内容。救命?

在void UndirectedGraph :: minSpanningTree()中:

std::vector<Vertex*> visited;

if(vertices.begin() != vertices.end())
{
    visited.push_back(vertices.begin()->second);
    visited[0]->distance = 0;
}
else
{
    return;
}

std::vector<Vertex*>::const_iterator vit;
vit = visited.begin();
std::unordered_map<std::string, Edge> edges;
edges = vit -> getEdges();
Run Code Online (Sandbox Code Playgroud)

在const std :: unordered_map和Vertex :: getEdges()const中:

return edges;
Run Code Online (Sandbox Code Playgroud)

错误:

 UndirectedGraph.cpp:112:21: error: member reference base type 'Vertex
 *const' is
       not a structure or union
         edges = vit -> getEdges();
                 ~~~ ^  ~~~~~~~~ 1 error generated.
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

改变中

edges = vit -> getEdges();
Run Code Online (Sandbox Code Playgroud)

edges = *(vit)->getEdges();
Run Code Online (Sandbox Code Playgroud)

给了我同样的错误。

n. *_* m. 6

vit是一个迭代器。迭代的工作方式类似于指向容器元素的指针。您的容器元素类型为Vertex*。因此vitVertex**

要调用给定的成员函数,Vertex** p您必须先进入Vertex*。可以这样取消引用p

(*p)
Run Code Online (Sandbox Code Playgroud)

现在您可以像这样调用您的成员函数

(*p)->getEdges()
Run Code Online (Sandbox Code Playgroud)

迭代器没有什么不同。

注意

*(p)->getEdges()
Run Code Online (Sandbox Code Playgroud)

与上述完全不同(而且是错误的)。与...相同

*((p)->getEdges())
Run Code Online (Sandbox Code Playgroud)

(p)->getEdges()
Run Code Online (Sandbox Code Playgroud)

是相同的

p->getEdges()
Run Code Online (Sandbox Code Playgroud)

这是行不通的。

与此相关的是,如果使用原始指针,则可能做错了。您应该将Vertex对象直接存储在中,std::vector<Vertex>或者使用shared_ptrunique_ptr代替原始指针。