重载模板类中的二进制运算符不允许访问私有数据成员

Overloading Binary Operators within Template Class doesn't allow access to private data members

本文关键字:访问 不允许 数据成员 运算符 二进制 重载      更新时间:2023-10-16

我很确定我只是在做一些愚蠢的事情,但我一辈子都搞不清楚。

下面的原始代码。。。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
template <class T> class set
{
public:
    void add(T newElement);
    void remove(T newElement);
    bool contains(T aValue);
    int size();
    void print();
    set<T> get();
friend set<T> operator-(const set<T>& set1, const set<T> set2){
}
friend set<T> operator&(const set<T>& set1, const set<T> set2){
}
friend set<T> operator|(const set<T>& set1, const set<T> set2){
}
private:
    vector<T> setVec;
};
template <class T> 
void set<T>::add(T newElement){
    setVec.push_back(newElement);
}
template <class T>
void set<T>::remove(T newElement){
    it = find(setVec.begin(), setVec.end(), newElement);
    setVec.erase(it);
}
template <class T> 
void set<T>::print(){
    for (vector<T>::iterator it = setVec.begin(); it != setVec.end(); ++it){
        cout << *it << endl;
    }
    if (setVec.empty()){
        cout << "SET is empty." << endl;
    }
    cout << endl;
}
int main(){
    set<int> s;
    s.add(1);
    s.add(2);
    s.add(3);
    s.print();
    set<int> s3;
    s3.add(6);
    s3.add(5);
    s3.add(3);
    set<int> s4 = s | s3;
    s4.print();
    set<string> s2;
    s2.add("a");
    s2.add("b");
    s2.add("c");
    s2.print();
    system("PAUSE");
    return 0;
}

我只是想超载|,&,以及用于设置操作函数的-运算符。我知道如何实现该解决方案,但尽管成员函数是朋友,但我无法访问我传递的参数的私人数据成员。

有什么想法吗?

标有friend的操作员看起来和工作都很好:

friend set<T> operator|(const set<T>& set1, const set<T> set2){
    cout << set1.setVec.at(0) << " " << set2.setVec.at(0) << endl; // I am accessing private variable setVec here
    set<T> ss; // Some new set to return
    return ss;
}

请注意,set2也应作为const引用传递(与set1相同)。另外,考虑更改类的名称,因为std命名空间中已经有一个set