为什么将候选'='运算符重载标记为const?

时间:2019-01-21 02:07:33

标签: c++ lemon-graph-library

我不能使用std::set_union,因为我没有正确地重载赋值运算符。

我正在使用自己的结构std::set的{​​{1}},它本身包含另一个结构NodeChange_t。这是这些人的运算符重载:

point_t

在这种情况下,我希望// ---- defs.h struct point_t { double x; double y; ... void operator=(const point_t &p) { x = p.x; y = p.y; } ... }; struct NodeChange_t { SNode node; point_t change; ListDigraph *graph; ... void operator=(const NodeChange_t &otherChange) { this->node = otherChange.node; this->change = otherChange.change; this->graph = otherChange.graph; } ... }; // ---- _2DSurface.cpp //Problematic code: void _2DSurface::updateInnerSurfaceV2(_2DSurface &outerSurf, std::set<NodeChange_t> *nodeChanges) { std::set<NodeChange_t> additions; ... // add stuff to additions std::set_union(additions.begin(), additions.end(), nodeChanges->begin(), nodeChanges->end(), nodeChanges->begin()); ... } 被覆盖。但是我不断得到的错误是:

*nodeChanges

如果要点是要修改左侧的内容,将赋值运算符标记为src/_2DSurface.cpp:308:7: note: in instantiation of function template specialization 'std::__1::set_union<std::__1::__tree_const_iterator<ct, std::__1::__tree_node<ct, void *> *, long>, std::__1::__tree_const_iterator<ct, std::__1::__tree_node<ct, void *> *, long>, std::__1::__tree_const_iterator<ct, std::__1::__tree_node<ct, void *> *, long> >' requested here std::set_union(nodeChanges->begin(), nodeChanges->end(), additions.begin(), additions.end(), nodeChanges.begin()); include/defs.hpp:258:7: note: candidate function not viable: 'this' argument has type 'const std::__1::__tree_const_iterator<ct, std::__1::__tree_node<ct, void *> *, long>::value_type' (aka 'const ct'), but method is not marked const void operator=(struct ct &otherChange) 甚至有什么意义呢?我一直在玩const限定词,但似乎一无所获。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

  

如果要点是要修改左侧的内容,将赋值运算符标记为const甚至有什么意义?

赋值运算符未标记为const。实际上,错误消息说明了很多。它是错误的触发因素之一。再重点看一下错误消息的相关部分:

  

候选函数不可行:'this'自变量具有类型 [snipped] (又称为“ const ct” '),但方法未标记为const

该错误的另一个触发因素是,接收分配的对象被标记为const。如果查看错误消息中提到的类型,可能会注意到“ const_iterator”。这是你的线索!在某个地方,常量迭代器被取消引用,并且为结果分配了一个值。所有涉及的迭代器都是set迭代器,因此让我们看一下documentation for setset的{​​{1}}类型是常量迭代器;你不能写。 (对于iteratorsetiterator类型通常是同一类型的别名。这种冗余允许接口与其他容器一致。)

set_union algorithm需要目的地的输出迭代器。 const_iterator没有输出迭代器。因此,即使单词“ set”出现在“ set_union”中,set也无法直接输出set_union

还涉及set文档中的另一个详细信息:“结果范围不能与任何一个输入范围重叠。” 您无法完成所需的操作(替换其中一个输入)与{)set_union一起执行。如果这是您要使用的工具,则需要将联合输出到辅助容器,然后在单独的步骤中更新set_union。但是,使用set::insert(版本5)可能会更简单:

nodeChanges