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

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

Войти
Регистрация
Восстановить пароль
 
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

18.12.2009, 23:08. Просмотров 664. Ответов 4
Метки нет (Все метки)

Вкратце - в разных векторах,содержащих разные классы,нужно найти строку (функции возврата строки в этих классах одинаковы).
Чтобы не делать 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++
Как, каким образом &quot;скомпилировать&quot; код для С или С++? Как лучше всего это сделать?

[Решено] Ошибка: "Undefined symbol _main in module c0.ASM" при компиляции в пакетном режиме - C++
Доброго времени суток всем! При компиляции в пакетном режиме выходила следующая ошибка: Undefined symbol _main in module c0.ASM Но...

Написать код шифрования методом "Змеиный" и "Спиральный" - C++
весь интернет перерыл, не могу найти ничего нормального, если кто может или знает напишите хоть ссылки, срочно нужно

Зачем тут нужен амперсанд "&"? - C++
Программа с помощью контейнера сортирует строки из входного файла по алфавиту и преобразует их к верхнему регистру. Вопрос: зачем в строке...

Все время программировали на Pascal, а тут бац, и программируйте на С++ или вам "конец"! - C++
Задание 1 Разработать программу обработки массивов Подпрограмма должна находить сумму положительных элементов нечетных строк матрицы...

Не могу скомпилировать прогрумма "Hello world" - C++
Всем привет! Я не так давно решил начать изучать язык С++. До этого никаким образом программирования не касался вообще. Тема для меня...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Временно недоступен
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++
3134 / 1446 / 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. она точно, для любого типа итератора, вернет правильное значение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2009, 03:59     [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код?
Еще ссылки по теме:

Как можно "рисовать" различные линии и фигуры, в том числе и трёхмерные в C++? - C++
Я хотел бы узнать, есть ли какая-нибудь литература по рисованию в C++ трёхмерных объектов (да и просто графиков всяких, простых рисунков,...

Как дописать код для полного функционирования? Структура "Студент" - C++
все в принципе работает с одним студентом,но есть загвоздка,если ставишь больше то он ответы выдает на первого правильно а на других как...

Прошу помочь. Как в Borland C++ 6 Bulder запустить программный код "Си" ? - C++
Чего-то у меня не получается. Или на каком либо компиляторе писать?

Можно ли как то реализовать "круглый массив"? - C++
Допустим, у меня есть char массив длиной 4. char mas={'A', 'B', 'C', 'D', 'E'}; Моя задача в том, чтобы двигаться по массиву...


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

Или воспользуйтесь поиском по форуму:
#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++] Как тут можно "схитрить" и скомпилировать такой код?
Ответ Создать тему
Опции темы

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