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

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

Восстановить пароль Регистрация
 
togramago
9 / 9 / 0
Регистрация: 03.11.2009
Сообщений: 39
02.05.2010, 19:32     шаблоны и typename в частности #1
Здравствуйте!
Я разбираюсь с ассоциативными контейнерами в с++ - делаю лабораторную по ним
функция 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 в частности
Посмотрите здесь:

C++ Typename и Class
C++ Для чего нужен шаблон <typename T>
typename. Проблемы с вложенными шаблонными типами C++
C++ Оператор typename
C++ Шаблоны. Что лучше <class T> или <typename T>?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
    }
 
}
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 в частности
Ответ Создать тему
Опции темы

Текущее время: 06:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru