qq_26140425 2019-06-06 20:12 采纳率: 0%
浏览 497

Set类的模板实现 为什么=操作符无法接受变量

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;
}
  • 写回答

1条回答 默认 最新

  • Italink 2019-06-07 02:11
    关注

    下面的重载需要返回引用

    Set operator+(Set& rhs);
    Set operator-(Set& rhs);
    Set operator*(Set& rhs);
    -->
    Set& operator+(Set& rhs);
    Set& operator-(Set& rhs);
    Set& operator*(Set& rhs);

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘