C++ Member Reference base type 'Vertex *const' is not a structure or union

c++, constants, iterator, reference, vector

Solution

`vit` is an iterator. Iteratirs work like pointers to container elements. Your container element type is `Vertex*`. Therefore `vit` works like `Vertex**`.

To call a member function given a `Vertex** p` you would have to get to a `Vertex*` first. This can be done by dereferencing `p` like this:

(*p)

and at this point you can call your member function like

(*p)->getEdges()

Iterators are no different.

Note

*(p)->getEdges()

is totally different from the above (and wrong). It is the same as

*((p)->getEdges())

and

(p)->getEdges()

is the same as

p->getEdges()

which is known not to work.

On a related note, if you are using raw pointers you are probably doing it wrong. You should either store `Vertex` objects directly in an `std::vector<Vertex>` or use `shared_ptr` or `unique_ptr` in lieu of raw pointers.

Problem

I am running into trouble trying to access the methods of an object stored in a vector. I know that getEdges returns an unordered map of edge but I am missing something with how to reference a Vertex object from within a vector. Help? In 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(); ``` In const std::unordered_map & Vertex::getEdges() const: ``` return edges; ``` The error: ``` UndirectedGraph.cpp:112:21: error: member reference base type 'Vertex *const' is not a structure or union edges = vit -> getEdges(); ~~~ ^ ~~~~~~~~ 1 error generated. ``` --EDIT-- Changing ``` edges = vit -> getEdges(); ``` to ``` edges = *(vit)->getEdges(); ``` gave me the same error.

Original source