1: Вы должны быть крайне осторожными при выводе из контейнеров стандартной библиотеки C ++. Это можно сделать, но поскольку у них нет виртуальных деструкторов и других подобных тонкостей, обычно это неправильный подход.
2: Правила перегрузки здесь немного странные. Компилятор сначала просматривает производный класс, и если он находит любую перегрузку с тем же именем, он прекращает поиск там. Он просматривает базовый класс только в том случае, если в производном классе не обнаружено перегрузок.
Простым решением этого является введение необходимых функций из базового класса в пространство имен производного класса:
class A : public std::multimap<int, bool>
{
public:
using std::multimap<int, bool>::erase; // Any erase function found in the base class should be injected into the derived class namespace as well
size_type erase(int k, bool v)
{
return erase(k);
}
};
В качестве альтернативы, конечно, вы можете просто написать небольшую вспомогательную функцию в производном классе, перенаправив ее на функцию базового класса