c++ - 我不确定为什么会收到此错误:“C++ 没有运算符与这些操作数匹配,操作数类型是:设置= 设置"
问题描述
当我尝试将 'A&&B' 分配给 outSet 时,它告诉我没有运算符 '=' 匹配,我不确定为什么我的赋值运算符不起作用。我的最终目标是展示 AB 和 C 之间的以下比较,但不幸的是,我坚持认为我可以做到这一点。任何帮助是极大的赞赏
我的 .cpp 文件
#include "set.h"
#include <algorithm>
#include <iostream>
int main()
{
Set<int> A(1, 8);
Set<int> B(2, 10);
Set<int> C(4, 6);
Set<int> outSet(0, 20);
A.add(1);A.add(3);A.add(8);
B.add(2);B.add(3);B.add(5);B.add(10);
C.add(4);C.add(6);
A.writeSet();
B.writeSet();
C.writeSet();
outSet = A&&B; //test assignment and intersection operator
outSet.writeSet();
/*
outSet = A-B; //test difference
outSet.writeSet();
outSet = A||B; //test union
outSet.writeSet();
outSet = A/B;
outSet.writeSet();
outSet = A&&C;
outSet.writeSet();
outSet = A-C;
outSet.writeSet();
outSet = A||C;
outSet.writeSet();
outSet = A/C;
outSet.writeSet();
*/
return 0;
}
我的 set.h 文件
#ifndef SET_H
#define SET_H
#include "array_v.h"
#include <iostream>
#include <cassert>
template <class Universe>
class Set : protected Array_V<Universe, bool>
{
public:
Set(Universe loElement, Universe hiElement);
Set(Set <Universe>& initSet);
~Set();
void operator = (Set<Universe>& source);
bool empty();
bool operator == (Set<Universe>& t);
bool operator <= (Set<Universe>& t);
Set operator || (Set<Universe>& t);//union
Set operator && (Set<Universe>& t);//intersection
Set operator - (Set<Universe>& t); //a-b= elements in a not in b
Set operator / (Set<Universe>& t); //a/b= elements in union ab minus
//elements in intersection ab
void add(Universe element);
void remove(Universe element);
void writeSet();
bool inSet(Universe element);
protected:
Universe loElement, hiElement;
};
#include "set.t"
#endif
我的 set.t 文件
#ifndef SET_T_
#define SET_T_
#include <iostream>
using std::cout;
using std::endl;
using std::cerr;
#include <new>
using std::bad_alloc;
#include <cassert>
template <class Universe>
Set<Universe>::Set(Universe lo, Universe hi):
Array_V<Universe,bool>(lo,hi)
{
loElement = lo;
hiElement = hi;
for (Universe element = loElement; element <=hiElement; ++element)
(*this)[element] = false;
}
template <class Universe>
Set <Universe>:: Set(Set<Universe> &initSet)
:Array_V<Universe, bool> (initSet.loElement,initSet.hiElement)
{
loElement = initSet.loElement;
hiElement = initSet.hiElement;
for (Universe element = loElement; element <=hiElement; ++element)
(*this)[element] = initSet[element];
}
template<class Universe>
Set <Universe> Set<Universe>::operator || ( Set<Universe>&t)
{
Set<Universe> temp(loElement,hiElement);
if ((loElement!=t.loElement)||(hiElement!=t.hiElement))
{
cout << " && invalid ranges" << endl;
return (*this);
}
else for (Universe u = loElement; u <= hiElement; ++u)
temp[u] = ((*this)[u] || t[u]);
return temp;
}
template<class Universe>
Set <Universe> Set<Universe>::operator && ( Set<Universe>&t )
{
Set<Universe> temp(loElement,hiElement);
if ((loElement!=t.loElement)||(hiElement!=t.hiElement))
{
cout << " && invalid ranges" << endl;
return (*this);
}
else for (Universe u = loElement; u <= hiElement; ++u)
temp[u] = ((*this)[u] && t[u]);
return temp;
}
template <class Universe>
Set<Universe>::~Set()
{}
template <class Universe>
void Set<Universe>:: operator = ( Set<Universe> &source )
{
if ((loElement != source.loElement) || (hiElement != source.hiElement))
cout << " invalid assignment: incompatable ranges " << endl;
else
for (Universe el = loElement; el <= hiElement; el ++)
(*this)[el] = source[el];
}
template <class Universe>
bool Set<Universe>::empty()
{
bool temp = true;
for (Universe el = loElement; el <= hiElement; el++)
if ((*this)[el]) temp = false;
return temp;
}
template <class Universe>
bool Set<Universe>::operator == ( Set<Universe> &t )
{
bool temp = true;
if ((loElement!=t.loElement)||(hiElement!=t.hiElement))
{
cout << " == invalid ranges" << endl;
return false;
}
else
{
for (Universe el = loElement; el <=hiElement; el++)
if ((*this)[el]!=t[el])
temp = false;
return temp;
}
}
template <class Universe>
bool Set<Universe>::operator <= ( Set<Universe>&t )
{
bool temp = true;
if ((loElement!=t.loElement)||(hiElement!=t.hiElement))
{
cout << " <= invalid ranges" << endl;
return false;
}
else
{
for (Universe el = loElement; el <=hiElement; el++)
if ((*this)[el]&&(!t[el]))
temp = false;
return temp;
}
}
template <class Universe>
void Set<Universe>::add(Universe el )
{
(*this).assign(el, true);
}
template <class Universe>
void Set<Universe>::remove(Universe el )
{
(*this)[el] = false;
}
template <class Universe>
void Set<Universe>:: writeSet()
{
bool comma = false;
cout << '(';
for (Universe el = loElement; el <=hiElement; el++ )
{
if (comma && (*this)[el]) cout << ',';
if ((*this)[el])
{
cout << el ;
comma = true;
}
}
cout << ')' << endl;
}
#endif
解决方案
A&&B
这个表达式的结果是一个临时值,一个纯右值。
void operator = (Set<Universe>& source);
您的赋值运算符重载的参数是对可变对象的引用。
临时值不绑定到对可变对象的引用;但仅限于对常量对象的引用。您需要将重载更改为:
void operator = (const Set<Universe>& source);
并相应地更改其代码。
所有其他运算符重载也应该以同样的方式进行更改。
此外,按照惯例,=
重载预计会返回*this
,因此应将其声明为
Set<Universe> &operator = (const Set<Universe>& source);
推荐阅读
- c# - 在 Linq 中使用时,如何让我的班级表现得像 Guid?
- c# - 根据用户正在运行的分辨率转换分辨率
- python - Pytorch如何将除第一维之外的可变大小的张量相乘
- python - 如何在 Python 中实现 Thread.ResetAbort 方法
- php - Laravel 忽略用于验证电子邮件的 APP_URL
- python-3.x - 动态读取和写入字典
- apache - 为什么 Apache SVN 存储库列表显示为空?
- ios - 编译 xcode 项目时 Alamofire 的大量问题
- javascript - 如何在本地主机中显示来自 json 文件的图像?
- python - Apply on Dataframe 将第一行值传递给所有行