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

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

Войти
Регистрация
Восстановить пароль
 
togramago
9 / 9 / 0
Регистрация: 03.11.2009
Сообщений: 39
#1

шаблоны и typename в частности - C++

02.05.2010, 19:32. Просмотров 833. Ответов 3
Метки нет (Все метки)

Здравствуйте!
Я разбираюсь с ассоциативными контейнерами в с++ - делаю лабораторную по ним
функция equal_range() одинакова для set, multiset, map, multimap и возвращает pair<container::iterator, container::iterator>
я пытаюсь написать одну общую функцию для всех єтих контейнеров которая называется similar и имеет вот такой вид
C++
1
2
template<class T>
void similar(T & main, const T & specific);
где main - значения с которіми работаю, specific - для всяких вспомогательніх целей

собственно с equal_range я пытаюсь работать таким образом:
C++
1
typename pair<T::iterator, T::iterator> ret = main.equal_range(*spec);
где spec - итератор на specific

мне кажется что здесь явно что-то не так (а оно к тому же еще и выдает ошибки
C++
1
2
3
In function ‘void Similar::similar(T&, const T&):
 error: expected initializer before ‘<’ token
 error: ‘ret’ was not declared in this scope
и
C++
1
make: *** [similar.o] Error 1
которые по-видимому взаимосвязаны.

Расскажите, пожалуйста, как с єтим бороться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2010, 19:32     шаблоны и typename в частности
Посмотрите здесь:

Шаблоны. Что лучше <class T> или <typename T>? - C++
Одни пишут &lt;class T&gt;, другие &lt;typename T&gt; Какая между ними разница?

Оператор typename - C++
Здравствуйте. Делал недавно небольшую программку и столкнулся с одной интересной штукой. Суть примерно такая template &lt;class T1, class...

Typename и Class - C++
Между записью template &lt;class T&gt; и template &lt;typename T&gt; нет никакой разницы?

Typename в шаблонах класса - C++
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class CounterA{... требуется распознать тип, то есть переменная islong...

Typename перед инстанцированием - C++
В каких случаях перед созданием объекта надо писать typename... И зачем оно там надо? typename hlist::iterator it = cell.begin();

Template<typename T> vs auto - C++
template &lt;typename T&gt; vector&lt;T&gt; my_vec1; vector&lt;auto&gt; my_vec2;Какая разница между содержимым vec1 и vec2?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
02.05.2010, 20:02     шаблоны и typename в частности #2
Цитата Сообщение от togramago Посмотреть сообщение
общую функцию для всех єтих контейнеров которая называется similar и имеет вот такой вид
хотелось бы всё-таки увидеть какой она имеет вид (а не её заголовок)
togramago
9 / 9 / 0
Регистрация: 03.11.2009
Сообщений: 39
02.05.2010, 20:13  [ТС]     шаблоны и typename в частности #3
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
template<class T>
void Similar::similar(T & main, const T & specific)
{
    //Member functions for associate containers:
 
    T help; //constructor
    help = main; //operator=
 
    typename T::iterator spec = specific.begin();
 
    {//Operations:
        typename T::iterator it = main.begin();
 
        //find  Get iterator to element (public member function)
        cout << "Find: " << *(main.find(*spec)) << endl;
        //count Count elements with a specific key (public member function)
        cout << "Count: " << main.count(*spec) << endl;
        //lower_bound   Return iterator to lower bound (public member function)
        cout << "Lower_bound: " << *(main.lower_bound(*(++spec))) << endl;
        //upper_bound   Return iterator to upper bound (public member function)
        cout << "Upper_bound: " << *(main.upper_bound(*(++spec))) << endl;
        //equal_range   Get range of equal elements (public member function)
        cout << "\tEqual_range: " << endl;
 
//  !Вот здесь не работало но вследствии различніх ухищрений сработало   (не відает ошибки пока что)
//      !но я точно не знаю правильно ли и будет ли работать ибо есть еще ошибки *crying*
              typedef typename T::iterator ( itt);
        std::pair<itt, itt> ret;
        ret = main.equal_range(*spec);
        cout << "lower_bound points to " << *ret.first << endl;
        cout << "upper_bound points to " << *ret.second << endl;
 
    }
 
    {//Observers:
        //key_comp  Return key comparison object (public member function)
        
//   !Вот здесь відает что 
//   !error: invalid use of ‘std::set<int, std::less<int>, std::allocator<int> >::key_compare’
 
                typename T::key_compare kcpm;
        kcpm = main.key_compare();
        cout << "Key_compare: " << kcpm(*spec, *main.end()) << endl;
        //value_comp    Return value comparison object (public member function)
        typename T::value_compare vcmp = main.value_comp();
        cout << "Value_compare: " << vcmp(*spec, *main.begin()) << endl;
    }
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2010, 21:01     шаблоны и typename в частности
Еще ссылки по теме:

Что означает using typename в шаблоне? - C++
template &lt; typename T &gt; class Class_name { public: using value_type = T; ... что произошло в этом месте?...

Visual c++ шаблон template <typename TT> - C++
пытаюсь разобраться с шаблонами, но выдает ошибку я даже не знаю куда смотреть https://github.com/Paladin3by/OOP template &lt;typename...

Для чего нужен шаблон <typename T> - C++
Здравствуйте. template &lt;typename T&gt; T CLAMP(const T&amp; value, const T&amp; low, const T&amp; high) { return (value &lt; low) ? low : ((value...

Тип аргумента template<typename .Args> - C++
Нужно выполнить определенный код при определенном типе аргумента Через шаблон или во время выполнения - не важно, хотя лучше так, как...

typename. Проблемы с вложенными шаблонными типами - C++
Здравствуйте. Реализовываю шаблонный список. /* * List.h */ #pragma once #include &lt;iostream&gt; using namespace std;

Для чего необходимо ключевое слово typename - C++
Исходные данные. Есть класс CAppContainer, заголовочный файл appcontainer.h: #ifndef APPCONTAINER_H #define APPCONTAINER_H ...


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

Или воспользуйтесь поиском по форуму:
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
02.05.2010, 21:01     шаблоны и typename в частности #4
similar не сможет работать одинаково и с map и и с set
например строчка
C++
1
cout << "Find: " << *(main.find(*spec)) << endl;
*spec - для map не работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    map<int, string> m;
    m[3] = "33";
    m[4] = "44";
 
    map<int, string>::iterator it = m.begin();
    cout << it->first << endl;
 
    set<int> s;
    s.insert(1);
    s.insert(2);
 
    set<int>::iterator its = s.begin();
    cout << *its << endl;
Yandex
Объявления
02.05.2010, 21:01     шаблоны и typename в частности
Ответ Создать тему
Опции темы

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