C++ 成员引用基类型'Vertex *const'不是结构或联合

Posted

技术标签:

【中文标题】C++ 成员引用基类型\'Vertex *const\'不是结构或联合【英文标题】:C++ Member Reference base type 'Vertex *const' is not a structure or unionC++ 成员引用基类型'Vertex *const'不是结构或联合 【发布时间】:2014-11-23 06:49:15 【问题描述】:

我在尝试访问存储在向量中的对象的方法时遇到了麻烦。我知道 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();

在 const std::unordered_map & Vertex::getEdges() const:

return edges;

错误:

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

--编辑--

变化

edges = vit -> getEdges();

edges = *(vit)->getEdges();

给了我同样的错误。

【问题讨论】:

粘贴 getEdges 定义... 是:返回边; 边被声明为:std::unordered_map<:string edge>边; 【参考方案1】:

vit 是一个迭代器。迭代器就像指向容器元素的指针一样工作。您的容器元素类型是Vertex*。因此vit 的作用类似于Vertex**

要调用给定Vertex** p 的成员函数,您必须首先访问Vertex*。这可以通过取消引用 p 来完成,如下所示:

(*p)

此时您可以像

一样调用您的成员函数
(*p)->getEdges()

迭代器也不例外。

注意

*(p)->getEdges()

与上述完全不同(并且是错误的)。是一样的

*((p)->getEdges())

(p)->getEdges()

相同
p->getEdges()

这是已知的不起作用。

在相关说明中,如果您使用原始指针,您可能做错了。您应该将Vertex 对象直接存储在std::vector&lt;Vertex&gt; 中,或者使用shared_ptrunique_ptr 代替原始指针。

【讨论】:

只是我不明白他为什么需要使用指针?为什么不std::vector&lt;Vertex&gt;

以上是关于C++ 成员引用基类型'Vertex *const'不是结构或联合的主要内容,如果未能解决你的问题,请参考以下文章

C++ const 修饰符

c++中const总结

在 const 成员函数中返回 C++ 引用

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

C++学习基础六——复制构造函数和赋值操作符

C++ - 使用 const 引用来延长一个临时的、好的或 UB 的成员?