我不能使用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
限定词,但似乎一无所获。任何帮助表示赞赏。
答案 0 :(得分:2)
如果要点是要修改左侧的内容,将赋值运算符标记为
const
甚至有什么意义?
赋值运算符未标记为const
。实际上,错误消息说明了很多。它是错误的触发因素之一。再重点看一下错误消息的相关部分:
候选函数不可行:'this'自变量具有类型 [snipped] (又称为“ const ct” '),但方法未标记为const
该错误的另一个触发因素是,接收分配的对象被标记为const
。如果查看错误消息中提到的类型,可能会注意到“ const_iterator
”。这是你的线索!在某个地方,常量迭代器被取消引用,并且为结果分配了一个值。所有涉及的迭代器都是set
迭代器,因此让我们看一下documentation for set
。 set
的{{1}}类型是常量迭代器;你不能写。 (对于iterator
,set
和iterator
类型通常是同一类型的别名。这种冗余允许接口与其他容器一致。)
set_union
algorithm需要目的地的输出迭代器。 const_iterator
没有输出迭代器。因此,即使单词“ set”出现在“ set_union”中,set
也无法直接输出set_union
。
还涉及set
文档中的另一个详细信息:“结果范围不能与任何一个输入范围重叠。” 您无法完成所需的操作(替换其中一个输入)与{)set_union
一起执行。如果这是您要使用的工具,则需要将联合输出到辅助容器,然后在单独的步骤中更新set_union
。但是,使用set::insert
(版本5)可能会更简单:
nodeChanges