Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона?

15.12.2011, 23:25. Показов 3196. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
собсно
C++
1
2
3
4
5
6
7
8
9
10
template <class T>
class perestanovki {
 
 public:
  T<int> v;
  
};
 
int main () {
}
А в реальной жизни вместо T будет например, vector
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2011, 23:25
Ответы с готовыми решениями:

В шаблонном классе, один из параметров которого контейнер, объявить итератор этого контейнера
Собсно #include &lt;windows.h&gt; #include &lt;iterator&gt; #include &lt;vector&gt; using namespace std; ...

Переменная, содержащая тип, в шаблонном классе
есть некий шаблонный класс. объект класса создается как-то так newtype&lt;int&gt; a; здесь int...

Как описывать функции, заданные в шаблоне класса, тип возвращаемого значения которых совпадает с именем класса
Здравствуйте. А как описывать функции, заданные в шаблоне класса, тип возвращаемого значения...

Итераторы, как параметры лябда-функций в шаблонном классе
Доброго здоровья! Есть такой код (упрощенный вариант для наглядного описания ситуации): ...

12
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2011, 23:34 2
надо смотреть в сторону шаблоных параметров шаблонов. но заюзать стл контейнеры переносимо не получится. все потому, что у них не стандартизировано количество параметров по умолчанию.

C++
1
2
3
4
5
template <template <typename> class Cont>
struct X
{
   Cont<int> m_cont;
};
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
15.12.2011, 23:59  [ТС] 3
Синтаксис понятен, а объяснение непонятно. Ну то есть я понял, что это вот не должно работать и оно не работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
using namespace std;
 
template <template <class> class t>
struct str {
 t<int> v;
};
 
int main () {
 str <vector> x;
 
 //ну или так
 //str <vector <int> > x;
}
а почему не работает- непонятно. Чё мешает создаться такой структуре?
struct perestanovki {
vector<int> v;
};
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2011, 00:10 4
C++
1
template <template <class> class t>
тут указано что у шаблонного параметра шаблона должен быть один параметр. а у стл контейнеров после необходимого типа элемента, который в контейнере хранится идут дефолтные параметры всяких аллокаторов и прочее. вот спискок этих дефолтных параметров не стандартизирован, а шаблоный параметр шаблона требует, чтобы количество перечисленных параметров шаблона совпадало с количеством параметров того шаблона, которым параметризируется ваш хитрый класс.
посмотрите на файл, где у вас вектор определен. если у него два параметра, то попробуйте начать свой шаблон с такой строчкой:

C++
1
template <template <class, class> class t>
может с новым стандартом что-то улучшили с шаблонами. я этого не знаю.
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
16.12.2011, 00:57  [ТС] 5
Чудо свершилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vector>
#include <stack>
#include <list>
#include <queue> 
 
using namespace std;
 
template <template <class, class> class t, class T>
struct str {
 t<T, allocator<T> > v;
};
 
int main () {
 str <vector, int> x;
 str <stack,  int> y;
 str <list,   int> z;
 str <queue,  int> a;
}
Здесь ещё глянул. Чё будет дальше не знаю, если чё отпишусь
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
17.12.2011, 03:15  [ТС] 6
Но теперь не понять, почему не компилится это вот:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <windows.h>
#include <vector>
#include <stack>
#include <deque>
using namespace std;
 
 
//T предназначена заменять собой "Сишный" тип, вроде int или float 
//t заменяет контейнер, например, vector или stack
//t_ заменяет второй параметр параметра t
//Проще говоря, вот шаблон для вектора 
//template < class T, class Allocator = allocator<T> > class vector;
 
//а вот для стека 
//template < class T, class Container = deque<T> > class stack;
 
 
template <class T, template <class, class > class t, template <class> class t_ >
class klass {
 public:
  klass (t<T, t_<T> >& prom) {;}
};
 
 
         //+++++++++++++++++++++++++++++++++++++++++++++++++//
 
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 //Тут всё нормально компилится
 vector <int> vec;
 klass<int, vector, allocator> klass_(vec);
 
 stack <int> stac;
 
 //А тут нет
 //klass<int, stack, deque > klass__(stac);
 
 return 0;
}
Вот здесь стандарт шаблона класса vector,
А здесь шаблона класса stack

Видно, что если использую вектор, то надо писать allocator, что я и делаю, а если стек, то надо писать deque. Но во втором случае почему-то не компилится.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.12.2011, 04:24 7
kravam, Дек как бэ тоже с аллокатором.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
17.12.2011, 05:22  [ТС] 8
У меня второй контейнер не очередь, а стек. Доля него первый параметр это int, второй сам stack, а третий берём отсюда:
template < class T, class Container = deque<T> > class stack; Так что всё верно, надо писать
C++
1
 klass<int, stack, deque > klass__(stac);
хотя
C++
1
klass<int, stack, allocator> klass__(stac)
не компилится тоже
0
Заблокирован
17.12.2011, 08:03 9
как уже выше сказали deque не подходит
C++
1
2
3
4
// TEMPLATE CLASS deque
template<class _Ty,
    class _Ax = allocator<_Ty> >
    class deque
два ведь параметра, а ты пытаешься один подсунуть, а параметры по умолчанию в шаблоных параметрах шаблона не работают
вот у тебя шаблоный параметр с одним аргументом:
Цитата Сообщение от kravam Посмотреть сообщение
template <class> class t_
а в deque то их два! поэтому t_ deque заменить нельзя

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class klass {
 public:
     template <class T>
         klass (T& prom) {;}
};
 
 
         //+++++++++++++++++++++++++++++++++++++++++++++++++//
 
 
int main () {
 
 //Тут всё нормально компилится
 vector <int> vec;
 klass klass_(vec);
 
 stack <int> stac;
 
 //А тут нет
 klass klass__(stac);
 
 return 0;
}
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
17.12.2011, 08:07  [ТС] 10
Ну чё-то начал понимать, то есть получается, если параметр класса вектор или список, то можно изловчиться и написать шаблон класса с пустым конструктором, а вот если вектор или стек (или одинарная очередь), то шансов вообще нет?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.12.2011, 10:43 11
Цитата Сообщение от kravam Посмотреть сообщение
а вот если вектор или стек (или одинарная очередь), то шансов вообще нет?
Это почему же? О_о
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
17.12.2011, 11:28  [ТС] 12
Все мои доказательства. Как говорится, чем богаты тем и рады.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <windows.h>
#include <vector>
#include <stack>
#include <deque>
#include <list>
#include <queue>
using namespace std;
 
 
 
//главное смотреть тут
//Это шаблон класса, параметр которого может быть вектор, список
//или двустороняя очередь
template <class T, template <class, class > class t, template <class> class t_ >
class klass_ {
 public:
  klass_ (t<T, t_<T> >& prom) {;}
};
 
//А это шаблон класса, параметром которого может быть очередь или стек 
template <class T, template <class, class > class t, template <class, class> class t_ >
class _klass {
 public:
  _klass (t<T, t_<T,allocator<T> > > & prom) {;}
};
 
//Шаблоны не взаимозаменяемы. Потому, что догадайтесь сами почему
 
         //+++++++++++++++++++++++++++++++++++++++++++++++++//
 
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 //Тут вектор, список и двусторонняя очередь
 vector <int> vec_;
 klass_  <int, vector, allocator> klass_v_  (vec_);
 list   <int> list_;
 klass_  <int, list, allocator  > klass_l_ (list_);
 deque  <int> deque_;
 klass_  <int, deque, allocator > klass_d_(deque_);
 
 
 //тут очередь и стек
 stack  <int> _stack;
 _klass <int, stack, deque> _klass_d (_stack);
 queue  <int> _queue;
 _klass <int, queue, deque> _klass_q (_queue);
 
 return 0;
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.12.2011, 15:10 13
Можно сделать во первых через специализации класса.
Во вторых через шаблоны с переменным числом аргументов.
0
17.12.2011, 15:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2011, 15:10
Помогаю со студенческими работами здесь

Как использовать механизм сигналов и слотов в шаблонном классе?
Насколько я знаю, в qt невозможно использовать сигналы и слоты в реализации шаблонных классов, но...

Как программно определить тип параметра реестра?
Друзья! Продолжаем разбираться с реестром. Вот есть такой способ. Допустим, есть раздел...

Параметры в шаблонном классе
Почему в шаблонном классе при описании функции надо два раза указывать тип параметра? В 1-ой...

String в шаблонном классе
Как сделать так, чтобы в Map&lt;int, std::string&gt; A; работало со string'ом С интами чарами и т.д. все...

Итератор в шаблонном классе
итератор в шаблонном классе?

Ошибки в шаблонном классе
Добрый день. Реализовал класс динамического массива. При проверке его работы столкнулся с ошибками,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru