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

[Решено][C++] Как тут можно "схитрить" и скомпилировать такой код? - C++

Восстановить пароль Регистрация
 
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
18.12.2009, 23:08     [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код? #1
Вкратце - в разных векторах,содержащих разные классы,нужно найти строку (функции возврата строки в этих классах одинаковы).
Чтобы не делать 10 перегруженных функций,попробовал сделать шаблон.Код ниже.Но это не проходит компиляцию.Как можно всё-таки схитрить и сделать такой шаблон? Спрашивал в англоязычных чатах,мне намекнули на этот способ http://codepad.org/ecnvop82 но,честно говоря,я не понял,как применительно к этому конкретному случаю его использовать. Компетентные в С++ люди,подскажите?
C++
1
2
3
4
5
6
7
8
  template <typename T> size3 
  findStrInVector (const string str,std::vector< T *> &vec)
  {
     for (std::vector< T *>::iterator i = vec.begin(); i < vec.end();  ++i )
        if ((*i)->GetStr()  == str)
           return i-vec.begin();
     return -1;
  }
Добавлено через 11 минут
Немного помучавшись,у меня получилось! Вот,если кто-то столкнётся с такой проблемой,нужно просто поменять таким образом:
C++
1
2
3
4
5
6
7
8
  template <typename T> size3
  findStrInVector (const string str,std::vector< T *> &vec)
  {
     for (typename std::vector<T>::iterator i = vec.begin(); i < vec.end();  ++i )
        if ((*i)->GetStr()  == str)
           return i-vec.begin();
     return -1;
  }
Т.е. просто добавить слово typename перед объявлением итератора.Объяснение,почему так,я,правда,не очень понял.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2009, 23:08     [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код?
Посмотрите здесь:

C++ [Решено] Ошибка: "Undefined symbol _main in module c0.ASM" при компиляции в пакетном режиме
C++ Не работает код. В чём причина? Как "заставить" работать?
Сколькими способами можно получить строку "В" из строки "А", вычеркивая некоторые символы C++
C++ Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9")
C++ Что означает "Программа "[4872] laba!.exe: Машинный код" завершилась с кодом 3 (0x3)."?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
firefox1913
 Аватар для firefox1913
27 / 27 / 2
Регистрация: 01.07.2009
Сообщений: 58
19.12.2009, 00:30     [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код? #2
C++
1
2
3
4
5
6
7
8
9
10
template <class T >
int findStrInVector(const string &str, const vector<T* > &vec)
{
   vector<T* >::const_iterator i = vec.begin();
   for( ; i != vec.end(); i++)
       if((*i).GetStr()== str)
           return advance(i,vec.begin());
 
   return -1;
}
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
19.12.2009, 03:01  [ТС]     [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код? #3
Нет,так тоже не компилируется,только если
C++
1
2
3
4
5
6
7
8
9
10
template <class T >
int findStrInVector(const string &str, const vector<T* > &vec)
{
   class vector<T* >::const_iterator i = vec.begin();
   for( ; i != vec.end(); i++)
       if((*i).GetStr()== str)
           return advance(i,vec.begin());
 
   return -1;
}
Только вот в чём тут суть?
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.12.2009, 03:56     [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код? #4
нужно подсказать компилятору, что "я" инстанцирую шаблон, для того чтоб получить тип(в данном случае итератор) который определен в классе, и зависит от типа для шаблона.

Добавлено через 8 минут
firefox1913, в коде у #pragma, в этой строке:
Цитата Сообщение от #pragma Посмотреть сообщение
return i-vec.begin();
вычисляется дистанция между итераторами.
а ты предложил это:
Цитата Сообщение от firefox1913 Посмотреть сообщение
return advance(i,vec.begin());
не находишь противоречивость?
про advance: http://www.cplusplus.com/reference/s...rator/advance/
наверное имелось ввиду distance: http://www.cplusplus.com/reference/s...ator/distance/


#pragma,
такого:
Цитата Сообщение от #pragma Посмотреть сообщение
i-vec.begin();
никогда не делай. однажды твой код начнет падать, и ты оооочень долго будешь думать, в чем же дело?!! а дело окажется в том, что не все типы итераторов можно складывать/вычитать. для этого существует distance. она точно, для любого типа итератора, вернет правильное значение.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
19.12.2009, 03:59  [ТС]     [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код? #5
Цитата Сообщение от niXman Посмотреть сообщение
#pragma,
такого:
никогда не делай. однажды твой код начнет падать, и ты оооочень долго будешь думать, в чем же дело?!! а дело окажется в том, что не все типы итераторов можно складывать/вычитать. для этого существует distance. она точно, для любого типа итератора, вернет правильное значение.
Спасибо,переделал.
Yandex
Объявления
19.12.2009, 03:59     [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код?
Ответ Создать тему
Опции темы

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