二进制“=”:未找到接受类型为 'const Thing' 的左侧操作数的运算符
Binary '=': no operator found which takes a left-hand operand of type 'const Thing'
我已经阅读了重复的内容,但确实对我没有帮助。
我正在尝试达到下一个行为。
有一个由对 {Thing, set < Thing >}
组成的向量
我想要{Thing, newSetOfThing < Thing >}
的最终结果
其中 'newSetOfThing' 是彼此应用的差异
设置向量但他自己。差异意味着拥有所有值但包含在其他集合中。我正在使用 std::set_difference
.
用数字给出一个更接近的例子。
vector = {[1, {3,4,5,7}], [2,{1,3,9}], [3, {1,2,12}]};
==>
vectorResult = {[1, {4,5,7}], [2, {9}], [3, {2,12} }
那么我的代码如下所示:
class Thing {
public:
Thing () {
};
~Thing () {};
int position; //id
bool operator<(const Thing &Other) const;
};
bool Thing::operator<(const Thing &Thing) const
{
return(Other.position<position);
}
//The original vector
vector<pair<Thing, set<Thing>>> pairWithSet;
// I fill vector here [...]
// variable I define to store partial results
set<Thing> differenceResult;
// Vector I want to fill for results
vector<pair<Thing, set<Thing>>> newPairWithSet;
// Operation
for (pair<Thing, set<Thing>> currentPair : pairWithSet){
Thing currentThing= currentPair.first;
differenceResult = currentPair.second;
for (int i=0; i<pairWithSet.size();i++) {
if (pairWithSet[i].first.position != currentThing.position) {
set_difference(differenceResult.begin(),
differenceResult.end(),
pairWithSet[i].second.begin(),
pairWithSet[i].second.end(),
differenceResult.begin());
}
newPairWithSet.push_back(pair<Thing, set<Thing>>(currentThing, differenceResult));
}
我向您解释了我的 objective ,但最后我认为问题与我使用 set_difference 操作的错误程度有关,我无法直接分配'Thing'。所以 set_difference 没有办法检查它们是否相同。因为错误是
binary '=': no operator found which takes a left-hand operand of type
'const Thing' (or there is no acceptable conversion
我说是因为可能还有其他错误会导致行为,因为在我解决操作员的问题之前我仍然无法调试。
我的问题是我是否需要声明“=”操作以及如何声明。或者如果我错过了什么,我需要用另一种方式来表演。
我可以确保问题出在我使用 set_difference 时,如果我评论这部分编译器会完成任务:
set_difference(differenceResult.begin(),
differenceResult.end(),
pairWithSet[i].second.begin(),
pairWithSet[i].second.end(),
differenceResult.begin());
而且我认为是因为最后它试图对一个 const 进行赋值(因为 std::pair
声明?),正如它所说的错误(那么显然编译器不知道如何操作)。所以我还不清楚如何递归执行它set_difference。
set_difference
将结果写入其第 5 个参数指向的位置。你传递 differenceResult.begin()
是错误的,因为 begin
for set
总是 returns const iterator。您不能在目标是 const 迭代器指向的对象的情况下执行写操作。
如果您想将 Thing
个对象作为 set_difference
算法的结果存储到 set
中,您可以使用 std::inserter
:
set<Thing> res; // CREATE EMPTY SET
set_difference(differenceResult.begin(),
differenceResult.end(),
pairWithSet[i].second.begin(),
pairWithSet[i].second.end(),
std::inserter(res,res.begin())); // CREATE INSERT_ITERATOR WHICH INSERTS THINGS INTO RES
然后你可以将res
复制到newPairWithSet
。
我已经阅读了重复的内容,但确实对我没有帮助。
我正在尝试达到下一个行为。
有一个由对 {Thing, set < Thing >}
组成的向量
我想要{Thing, newSetOfThing < Thing >}
的最终结果
其中 'newSetOfThing' 是彼此应用的差异
设置向量但他自己。差异意味着拥有所有值但包含在其他集合中。我正在使用 std::set_difference
.
用数字给出一个更接近的例子。
vector = {[1, {3,4,5,7}], [2,{1,3,9}], [3, {1,2,12}]};
==>
vectorResult = {[1, {4,5,7}], [2, {9}], [3, {2,12} }
那么我的代码如下所示:
class Thing {
public:
Thing () {
};
~Thing () {};
int position; //id
bool operator<(const Thing &Other) const;
};
bool Thing::operator<(const Thing &Thing) const
{
return(Other.position<position);
}
//The original vector
vector<pair<Thing, set<Thing>>> pairWithSet;
// I fill vector here [...]
// variable I define to store partial results
set<Thing> differenceResult;
// Vector I want to fill for results
vector<pair<Thing, set<Thing>>> newPairWithSet;
// Operation
for (pair<Thing, set<Thing>> currentPair : pairWithSet){
Thing currentThing= currentPair.first;
differenceResult = currentPair.second;
for (int i=0; i<pairWithSet.size();i++) {
if (pairWithSet[i].first.position != currentThing.position) {
set_difference(differenceResult.begin(),
differenceResult.end(),
pairWithSet[i].second.begin(),
pairWithSet[i].second.end(),
differenceResult.begin());
}
newPairWithSet.push_back(pair<Thing, set<Thing>>(currentThing, differenceResult));
}
我向您解释了我的 objective ,但最后我认为问题与我使用 set_difference 操作的错误程度有关,我无法直接分配'Thing'。所以 set_difference 没有办法检查它们是否相同。因为错误是
binary '=': no operator found which takes a left-hand operand of type 'const Thing' (or there is no acceptable conversion
我说是因为可能还有其他错误会导致行为,因为在我解决操作员的问题之前我仍然无法调试。
我的问题是我是否需要声明“=”操作以及如何声明。或者如果我错过了什么,我需要用另一种方式来表演。
我可以确保问题出在我使用 set_difference 时,如果我评论这部分编译器会完成任务:
set_difference(differenceResult.begin(),
differenceResult.end(),
pairWithSet[i].second.begin(),
pairWithSet[i].second.end(),
differenceResult.begin());
而且我认为是因为最后它试图对一个 const 进行赋值(因为 std::pair
声明?),正如它所说的错误(那么显然编译器不知道如何操作)。所以我还不清楚如何递归执行它set_difference。
set_difference
将结果写入其第 5 个参数指向的位置。你传递 differenceResult.begin()
是错误的,因为 begin
for set
总是 returns const iterator。您不能在目标是 const 迭代器指向的对象的情况下执行写操作。
如果您想将 Thing
个对象作为 set_difference
算法的结果存储到 set
中,您可以使用 std::inserter
:
set<Thing> res; // CREATE EMPTY SET
set_difference(differenceResult.begin(),
differenceResult.end(),
pairWithSet[i].second.begin(),
pairWithSet[i].second.end(),
std::inserter(res,res.begin())); // CREATE INSERT_ITERATOR WHICH INSERTS THINGS INTO RES
然后你可以将res
复制到newPairWithSet
。