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

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

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

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

18.12.2009, 23:08. Просмотров 668. Ответов 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 перед объявлением итератора.Объяснение,почему так,я,правда,не очень понял.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2009, 23:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [Решено][C++] Как тут можно "схитрить" и скомпилировать такой код? (C++):

Как, каким образом "скомпилировать" код для С или С++? - C++
Как, каким образом &quot;скомпилировать&quot; код для С или С++? Как лучше всего это сделать?

Как сделать, так чтобы i и j можно было вводить самому "i" И "j" в цикле, есть программа - C++
#include &lt;iostream&gt; using namespace std; int main() {int a=0,b=0; int i=0; cout&lt;&lt;&quot;Vvedite i=&quot;&lt;&lt;endl; cin&gt;&gt;i; ...

Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9") - C++
Нужно избавиться от такой глупости: char ch = 0; if(ch=='1')mas=1; if(ch=='2')mas=2; if(ch=='3')mas=3; ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Как и на чем написать и скомпилировать программу, чтоб загружалась через bootmgr и выводить "hello world"? - C++
Ну что-то типа совсем простой ОС, если это можно так назвать.

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
firefox1913
27 / 27 / 2
Регистрация: 01.07.2009
Сообщений: 58
19.12.2009, 00:30 #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;
}
1
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
19.12.2009, 03:01  [ТС] #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;
}
Только вот в чём тут суть?
0
niXman
Эксперт C++
3135 / 1447 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.12.2009, 03:56 #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. она точно, для любого типа итератора, вернет правильное значение.
2
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
19.12.2009, 03:59  [ТС] #5
Цитата Сообщение от niXman Посмотреть сообщение
#pragma,
такого:
никогда не делай. однажды твой код начнет падать, и ты оооочень долго будешь думать, в чем же дело?!! а дело окажется в том, что не все типы итераторов можно складывать/вычитать. для этого существует distance. она точно, для любого типа итератора, вернет правильное значение.
Спасибо,переделал.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2009, 03:59
Привет! Вот еще темы с ответами:

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Error C2440: инициализация: невозможно преобразовать "void *" в "listnode *". подскажите, что можно сделать? - C++
#include &lt;iostream&gt; struct listnode { char *data; int value; struct listnode *next; }; struct listnode...

Сколькими способами можно получить строку "В" из строки "А", вычеркивая некоторые символы - C++
)заданы 2 символьные строки А и Б . Требуется вычислить сколькими способами можно получить строку В из строки А, вычеркивая некоторые...

Что означает "Программа "[4872] laba!.exe: Машинный код" завершилась с кодом 3 (0x3)."? - C++
при запуске кода компилятор пишет &quot;Программа &quot; laba!!!!!!.exe: Машинный код&quot; завершилась с кодом 3 (0x3).&quot; и появляется окошечко с ошибкой....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.12.2009, 03:59
Ответ Создать тему
Опции темы

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