С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
1

Указание типа итератора в шаблоне

07.10.2015, 00:05. Показов 1792. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Расскажите про этот момент.
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
#include <iostream>
#include <vector>
 
using namespace std;
 
template <typename T, typename CONT = vector<T>>
class MyClass{
    CONT data;
public:
    void push(const T& value);
    void show();
};
 
 
template <typename T, typename CONT>
void MyClass<T, CONT>::show(){
   CONT::iterator it = data.begin();   // <---- Как это делали?
   for (it=data.begin(); it!=data.end(); ++it) cout << *it << "\t";
   cout << "\n";
}
 
template <typename T, typename CONT>
void MyClass<T, CONT>::push(const T& value){
    data.push_back(value);
}
 
int main(){
    MyClass<int> MyObj1;
    MyObj1.push(100);
    MyObj1.show();
}
Можно auto it = data.begin();, но меня сейчас интересуют непосредственно шаблоны. Я попробовал так, но не получилось. Как задать тип такому итератору?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2015, 00:05
Ответы с готовыми решениями:

Указание размера в шаблоне
Здравствуйте, я хочу задать несколько вопросов, ответы на которые я не смог найти на просторах...

Вывод типа элемента контейнера из итератора на контейнер
У меня есть шаблонная функция которая принимает итератор на начало и конец контейнера контейнеров,...

Указание типа после метода
Ребят здравствуйте подскажите пожалуйста 1 вопрос есть класс в котором есть такой метод public...

<!DOCTYPE> Указание типа документа
Обязательно ли указывать тип документа или можно обойтись без него? Если нет то какой из видов...

9
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
07.10.2015, 00:50 2
Лучший ответ Сообщение было отмечено daslex как решение

Решение

Цитата Сообщение от daslex Посмотреть сообщение
CONT::iterator it = data.begin(); // <---- Как это делали?
C++
1
typename CONT::iterator it = data.begin();
Добавлено через 8 минут
daslex, да, в книжке "Шаблоны С++. Справочник разработчика", можешь поискать главу про зависимые имена в шаблонах. Там подробно про это и связанное с этим поведение.
1
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,933
Записей в блоге: 1
07.10.2015, 00:55 3
DrOffset, как по мне, то в данном случае лучше будет const_iterator, заодно и show сделать const.
1
DrOffset
07.10.2015, 00:57
  #4

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
то в данном случае лучше будет const_iterator
Да я что, спорю? :)
У автора так было, вот я и передрал.
Вообще, каждого поправлять насчет стиля - никакого здоровья не хватит. Я не придаю этому значения, на вопрос отвечу и ладно.

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.10.2015, 01:44  [ТС] 5
Все норм. Я Джоссатиса читаю. Вот у него хорошо, но не очень плавно просто. А от книжки к книжке бросаться немного муторно. Там глава про аргументы по умолчанию и этот момент как-то или на потом оставлен или упущен просто. А сам попробуй догадайся.

Добавлено через 8 минут
когда я вот так сделал
const void show();
const void MyClass<T, CONT>::show()

меня компилятор предупреждает: " warning: type qualifiers ignored on function return type [-Wignored-qualifiers]|"
Что он хочет этим сказать?


так не предупреждает об этом
void MyClass<T, CONT>::show() const
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
07.10.2015, 02:24 6
у вас перегрузка функции show.
для разрешения перегрузки используется сигнатура функции, в которую входят аргументы функции и ее константность\неконстантность. возвращаемый тип не имеет значения, а вы свою функцию попытались перегрузить так, что они отличаются только типами возвращаемого значения, которые в сигнатуру не входят. при попытке вызова будет ошибка с неопределенностью, какую из этих двух вызывать. ну или даже еще раньше все случится, когда компилятор посчитает что у вас функция с одинаковой сигнатурой определена дважды.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.10.2015, 02:37  [ТС] 7
Чего-то я перегрузки не вижу. первая строчка относится к прототипу, вторая непосредственно к методу класса. Причем тут перегрузка я вообще не понимаю. Основной листинг в первом посте, остальное - экономия места.
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
07.10.2015, 02:44 8
можно еще так:
C++
1
decltype(data.begin()) it = data.begin();
1
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
07.10.2015, 02:54 9
это я не так понял. я подумал что это два разных метода, один из которых возвращает
void, а второй MyClass<T, CONT> и залечилось это когда вы один из методов сделали константным.

перегрузки нет. const void пожалуй не имеет значения, наверно поэтому и предупреждение, а не ошибка.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.10.2015, 03:00  [ТС] 10
я нашел ответ уже. да, не имеет смысла возвращать const void.
0
07.10.2015, 03:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2015, 03:00
Помогаю со студенческими работами здесь

Указание типа переменной и ссылки при объявлении\инициализации
Здравствуйте! Возник такой вопрос-зачем нужно указывать тип ссылки при ее инициализации? При...

Тело метода не может быть блоком итератора, так как "void" не является типом интерфейса итератора
using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; using...

Форма поиска в шаблоне пользовательского типа записи
Есть записи с видео. Каждая запись характеризуется: название, рубрика, само видео, дата. В...

Сделать вывод типа float в шаблоне вместо double
Здравствуйте,уважаемые пользователи.Недавно начал знакомится с шаблонами, и заметил одну вещь...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru