перегрузить функцию erase для класса set

multiset < int > S;

S.insert(1);
S.insert(1);
S.insert(2);
S.insert(2);
S.insert(3);
// S = {1, 1, 2, 2, 3}
    
S.erase(1);
S.erase(3);
S.erase(4);

после операций нужно, чтобы set содержал в себе 1, 2, 2

есть реализованная функция

template <class T, class U> void erase(T& t, const U& u) {
    auto it = t.find(u);
    if (it != t.end()) t.erase(it);
}

в таком случае работает просто через erase(S, x), но хотелось бы перегрузить операцию от самого класса, чтобы можно было писать S.erase(x)

template <class T> class set
{
    void erase(T u)
    {
        auto it = find(u);
        if (it != this.end()) erase(u);
    }
};

пытался сделать так, но по факту создается еще один класс с названием set и он не может выбрать какой именно я имею ввиду error: reference to 'set' is ambiguous

подскажите как такое можно реализовать


Ответы (1 шт):

Автор решения: DmitryK

Это потому что вы объявляете в шаблоне новый класс с тем же именем. А вам нужно перегрузить только функцию. Сделайте так:

template <class T> 
void set::erase(T u)
{
  ....
}

При этом, эта функция должна быть в объявлении класса.
Если вы пытаетесь перегрузить функцию класса из библиотеки, доступа к коду которого нет (или изменять/дополнять его строго не рекомендуется), то нужно делать класс-наследник, перегружать функцию в нем и пользоваться уже объектами этого класса. И да, имя класса-наследника не может совпадать с именем класса-родителя.
При создании класса-наследника (в том числе контейнера стандартной библиотеки), нужно передавать параметры шаблона в родительский класс.

template<class _Key>
class MySet : public std::set<_Key>
{
   public:
    void erase(_Key u)
    {
    }
};

В общем случае, изменять поведение классов стандартной библиотеки - задача для профессионалов. В Вашем случае просто напишите свою функцию erase(), принимающую множество и элемент, который надо удалить, и пользуйтесь ей вместо встроенной без всяких перегрузок.

template <class T> 
void erase(std::set<T> &u, T &elem)
{
  ....
}
→ Ссылка