Set类的模板实现 S3=S1+S2;这一句加法得到的无名临时对象应该是 Set类型的,然后作为参数传给=操作符重载函数 但是编译器却报错 说 =操作符无法接受Set类型的参数 没有与之匹配的重载函数 很奇怪 单独赋值 S3=S1;就没问题,这里不也是Set类型的参数传入=重载函数吗。。。为什么这里能匹配???
#include<iostream>
#include<list>
#include <algorithm>
using namespace std;
template<class T>
class Set {
friend ostream& operator<<(ostream& out, Set<T>& rhs) {
cout << "{";
for (int i = 0; i < rhs.getSize() - 1; i++) {
cout << rhs.l[i] << "," << ends;
}
cout << rhs.l[rhs.getSize() - 1] << "}";
}
public:
Set<T>(){}
Set<T>(Set<T>& s)
{
l = s.l;
}
/*Set(Set<T>&& s) {
}*/
bool isItem(T item);
void Add(T item);
void Delete(T item);
int getSize();
Set<T>& operator=(Set& rhs);
Set<T> operator+(Set<T>& rhs);
Set<T> operator-(Set<T>& rhs);
Set<T> operator*(Set<T>& rhs);
list<T> l;
};
template<class T>
bool Set<T>::isItem(T item) {
typename list<T>::iterator it;
for (it = l.begin(); it != l.end(); it++)
{
if (*it == item) return false;
else return true;
}
}
template<class T>
void Set<T>::Add(T item) {
if (isItem(item)) {
l.push_back(item);
}
}
template<class T>
void Set<T>::Delete(T item) {
l.erase(item);
}
template<class T>
int Set<T>::getSize() {
return l.size();
}
template<class T>
Set<T>& Set<T>::operator= (Set<T>& rhs)
{
if (this == &rhs)
return *this;
l.clear();
l = rhs.l;
return *this;
}
template<class T>
Set<T> Set<T>::operator+(Set<T> & rhs) {
Set<T> temp;
temp = *this;
typename list<T>::iterator it;
for (it = rhs.l.begin(); it != rhs.l.end(); it++)
temp.Add(*it);
return temp;
}
template<class T>
Set<T> Set<T>::operator-(Set<T> & rhs) {
Set<T> temp(*this);
typename list<T>::iterator it;
for (it = rhs.begin(); it != rhs.end(); it++)
temp.Delete(*it);
return temp;
}
int main() {
Set<int> S1, S2, S3;
S1.Add(1);
S1.Add(3);
S1.Add(4);
S1.Add(5);
S2.Add(1);
S2.Add(2);
S2.Add(6);
S1.l.push_back(123);
S2.l.push_back(456);
cout << S1.getSize() << endl;
S3=S1+S2;
cout << S3.getSize()<<endl;
cout<<(S1+S2).getSize()<<endl;
cout<<S3.getSize();
system("pause");
return 0;
}