перегрузить функцию 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 шт):
Это потому что вы объявляете в шаблоне новый класс с тем же именем. А вам нужно перегрузить только функцию. Сделайте так:
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)
{
....
}