gpt4 book ai didi

c++ - 为模板类重载运算符<<。即使使用 friend 关键字也无法获得私有(private)成员(member)

转载 作者:行者123 更新时间:2023-11-30 01:55:33 25 4
gpt4 key购买 nike

<分区>

我正在尝试创建一个 Set 类(使用模板 so)。我遇到的问题是当我尝试重载运算符 << 时。我尝试将我的函数定义为类 Set 的友元,但它不起作用。我收到此错误:错误:'std::set, std::allocator > Set::m_set' 是私有(private)的

这是我的代码:

#ifndef GUARD_set_h
#define GUARD_set_h

#include <iostream>
#include <array>
#include <vector>
#include <set>
#include <string>

using namespace std;

template <class T>
class Set
{

public:
Set() {} // est ce vraiment requis de l'écrire ? je pense qu oui mais a verif ou copy ?

Set(const T arr[], size_t arr_sz) // voir si operator= n est pas mieu ou copy ?
{
for(size_t i = 0; i < arr_sz; ++i)
m_set.insert(arr[i]);
}

Set(const vector<T>& vec)
{
for(size_t i = 0; i < vec.size(); ++i)
m_set.insert(vec[i]);
}

Set(const set<T>& st)
{
m_set = st;
}

Set(const Set& set_to_copy)
{
m_set = set_to_copy.m_set;
}



void insert(const T& elem)
{
m_set.insert(elem);
}

void remove(const T& elem)
{
m_set.erase(elem);
}

size_t cardinality() const
{
return m_set.size();
}

bool isEmpty() const
{
return m_set.empty();
}

/** DEBUT OPERATORS **/

Set& operator +=(const Set& st)
{
for (typename set<T>::iterator it = st.m_set.begin(); it != st.m_set.end(); ++it)
m_set.insert(*it);
return *this;
}


template<class U> friend ostream& operator<<(ostream &, const Set<T> &);

private:
set<T> m_set;
};


/** Non-Member Operators **/
template <typename T>
Set<T> operator+(Set<T> st1, const Set<T>& st2) // Set Union
{
Set<T> set_to_copy(st1);
set_to_copy += st2;
return set_to_copy;
}

template <typename T>
Set<T> operator -(Set<T> st1, const Set<T>& st2) // Union Complement
{
Set<T> set_to_copy(st1);
set_to_copy -= st2;
return set_to_copy;
}

template <class T>
ostream& operator<<(ostream &out, const Set<T> &st)
{
for (typename set<T>::iterator it = st.m_set.begin(); it != st.m_set.end(); ++it)
out << ' ' << *it;
cout << '\n';
return out;
}
#endif

看来问题是我正在尝试从默认集合类访问分配器,但我真的不知道我要在哪里使用它...有人知道如何正确使用它吗?我应该重新定义一个新的分配器吗?(如果可能的话,我想保留这种代码组织(这是一项学校工作,所以我有尊重的标准:/)我是 C++ 新手,之前从未使用过模板:/对不起大家我的英语大概,我已经感谢你的帮助:)

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com