Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
broDiaga_cpp
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
1

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

27.03.2012, 16:57. Просмотров 3542. Ответов 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
1. Создайте пустой целочисленный вектор и поместите в него 10 случайных чисел с...

Использование стандартных компонентов stl
Помогите реализовать задачу с помощью stl Даны натуральное число n,...

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

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int...

Наследование классов. Копирование производных классов
Здравствуйте всем, у меня такой вопрос: написал код #include &quot;stdafx.h&quot; ...

10
easybudda
Модератор
Эксперт CЭксперт С++
10147 / 6054 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
27.03.2012, 17:30 2
Вот так попробуйте
C++
1
2
template <typename t>
class smart_multimap: public std::multimap<t> {};
0
broDiaga_cpp
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
27.03.2012, 17:47  [ТС] 3
Нет, к сожалению, так тоже не получается...
0
easybudda
Модератор
Эксперт CЭксперт С++
10147 / 6054 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
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
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
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
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
27.03.2012, 19:46 6
http://liveworkspace.org/code/1a3e8a8bf5e5efa79e2c33b5f5832b8f
1
broDiaga_cpp
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
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
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.03.2012, 00:01 8
broDiaga_cpp, Функция-то класса?
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
28.03.2012, 10:07 9
Лучший ответ Сообщение было отмечено как решение

Решение

вообще изначально плохая идея
у std::multimap невиртуальные методы - он для наследования не предназначен
как минимум вы не сможете определить виртуальный деструктор (так как в с++ субклассы не могут управлять виртуальностью методов, определенных в суперклассе)

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

Добавлено через 1 минуту
либо приватное наследование, хотя так как виртуальных функций у multimap нет то сильно больше толку не будет, но возможно
3
broDiaga_cpp
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
28.03.2012, 15:32  [ТС] 10
ForEveR, да
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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/e375bc9730104d89ec3da249b88aba0f

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

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

Библиотека стандартных шаблонов (STL). Класс "vector"
1. Создать вектор (пусть это будет целочисленный вектор). 2. Заполнить его...

Библиотека стандартных шаблонов (STL). Класс "vector"
Задания к выполнению. В программе &quot;Dev-C++&quot;: 1. Создать вектор (пусть это...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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