Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.71
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
#1

Наследование стандартных классов STL - C++

27.03.2012, 16:57. Просмотров 2889. Ответов 10
Метки нет (Все метки)

Добрый день. Проблема такая: мне нужно создать свой класс, который будет наследоваться от класса multimap, определенного в стандартной библиотеке STL.
пишу:
C++
1
2
template <typename t>
class smart_multimap: public std::multimap {};
не получается. выдаёт:
error C2955: 'std::multimap' : use of class template requires template argument list
see declaration of 'std::multimap'
see reference to class template instantiation 'smart_multimap<t>' being compiled
Что делать? Мне потом нужно будет ещё с своём классе smart_multimap определять дополнительные функции.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2012, 16:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование стандартных классов STL (C++):

Библиотека стандартных шаблонов STL - C++
1. Создайте пустой целочисленный вектор и поместите в него 10 случайных чисел с интервалом значений от -15 до 15. 2. Напишите две...

Использование стандартных компонентов stl - C++
Помогите реализовать задачу с помощью stl Даны натуральное число n, действительные числа a1, ... , a2n . Вычислить (задание на снимке) я...

Сортировка списка строк с использованием стандартных алгоритмов библиотеки STL - C++
Сортировка слов по количеству в них букв 'А'. Сортировка списка строк с использованием стандартных алгоритмов библиотеки STL. Мне не...

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование классов. Копирование производных классов - C++
Здравствуйте всем, у меня такой вопрос: написал код #include &quot;stdafx.h&quot; class A //Создаем класс А { int mA; ...

Виртуальные методы стандартных классов C++ - C++
Подскажите в каких стандартных(базовых) классах есть виртуальные методы? Есть ли в String?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
27.03.2012, 17:30 #2
Вот так попробуйте
C++
1
2
template <typename t>
class smart_multimap: public std::multimap<t> {};
0
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
27.03.2012, 17:47  [ТС] #3
Нет, к сожалению, так тоже не получается...
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
27.03.2012, 18:26 #4
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
так тоже не получается
Ну ещё бы, там же 2 типа надо передавать
Вот так работает (метод от балды прилепил, лишь бы было...)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <map>
 
template <typename T1, typename T2>
class smart_multimap : public std::multimap<T1, T2> {
public:
    smart_multimap<T1, T2>() : std::multimap<T1, T2>() {}
    void head_out() const {
        std::cerr << this->begin()->first << " => " << this->begin()->second << std::endl;
    }
};
 
int main(){
    smart_multimap<int, int> sm;
    sm.insert(std::pair<int, int>(13, 31));
    sm.insert(std::pair<int, int>(23, 32));
    sm.insert(std::pair<int, int>(33, 33));
    
    sm.head_out();
    
    return 0;
}
1
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
27.03.2012, 19:36  [ТС] #5
А можно как-нибудь переопределить стандартную функцию insert()?
C++
1
2
3
4
typename multimap<T1,T2>::const_iterator insert(const pair<T1,T2> &pr)
{
//тело функции
}
Так не получается...
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
27.03.2012, 19:46 #6
http://liveworkspace.org/code/1a3e8a...2c33b5f5832b8f
1
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
27.03.2012, 22:28  [ТС] #7
Блин, а как мне пройтись по всему мультимэпу?
Пишу так:
C++
1
2
3
4
5
6
7
void head_out() const {
            multimap<T1,T2>::iterator i;
            for(i=this->begin(); i!=this->end(); i++)
            {
                std::cerr << i->first << " --> " << i->second << std::endl;
            }
        }
Неверно.

Добавлено через 32 минуты
Код сам по себе, я так понимаю, правильный, только как-то нужно аккуратно в функцию передать этот мультимэп...
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
28.03.2012, 00:01 #8
broDiaga_cpp, Функция-то класса?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.03.2012, 10:07 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
вообще изначально плохая идея
у std::multimap невиртуальные методы - он для наследования не предназначен
как минимум вы не сможете определить виртуальный деструктор (так как в с++ субклассы не могут управлять виртуальностью методов, определенных в суперклассе)

включение multimap и делегирование вызовов единственное решение

Добавлено через 1 минуту
либо приватное наследование, хотя так как виртуальных функций у multimap нет то сильно больше толку не будет, но возможно
3
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
28.03.2012, 15:32  [ТС] #10
ForEveR, да
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
28.03.2012, 16:23 #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <map>
 
template<class Key, class Value>
class my_map : public std::multimap<Key, Value>
{
   typedef std::multimap<Key, Value> base_t;
public:
   void print() const
   {
      for (typename base_t::const_iterator iter = this->begin(); iter != this->end(); ++iter)
      {
         std::cout << iter->first << " " << iter->second << std::endl;
      }
   }
};
 
int main()
{
   my_map<int, std::string> mp;
   mp.insert(std::make_pair(1, "abc"));
   mp.insert(std::make_pair(2, "bcd"));
   mp.print();
}
http://liveworkspace.org/code/e375bc...3da249b88aba0f

typename вы забыли. Но советую прислушаться к совету выше и не наследоваться от multimap.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2012, 16:23
Привет! Вот еще темы с ответами:

Как использовать наследников от стандартных классов? Например, CMyEdit? - C++
Я начал изучать MFC. Программа - простой диалог со строкой ввода. Диалог со строкой ввода нарисовал как ресурс. Мне нужно в clipboard...

Шаблоны классов, list (STL) - C++
Здравствуйте, столкнулся с проблемой, что при повторном выполнении цикла генерируется исключение &quot;access violation&quot;, в чем может быть...

Как поместить в STL-контейнер экземпляры разных классов? - C++
Как поместить в контейнер экземпляры разных классов(типов) :thank_you:?

Можно ли добавлять статические объекты классов в STL контейнеры? - C++
Или обязательно добавлять ссылки на них в контейнер? Нигде не могу найти ответа.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.03.2012, 16:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru