С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/47: Рейтинг темы: голосов - 47, средняя оценка - 4.89
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242

Не могу объявить итератор

12.07.2019, 01:19. Показов 9623. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Смотрел даже в инете как люди это делают - у меня не работает, выдает ошибки. Почему? 22 строка
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
#pragma once
#include <iterator>
#include <initializer_list>
#include <cassert>
template<class Data, int size>
class Array {
    Data arr[ size ];
public:
    using type = Data;
    Array(std::initializer_list<Data> l);
    Array(const Array&) = default;
    Array()             = default;
    int Size()const;
};
 
template<class Data, int size>
Array<Data, size>::Array(std::initializer_list<Data> l){
    try
    {
        int l_size = l.size();
        if (l_size > size)throw std::exception("Getting size of list bigger than allocated memory");
        initializer_list<Data>::iterator it;
        for (int i = 0; i < l_size; i++)
        {
            
        }
    }
    catch (const std::exception&ex)
    {
        assert(!ex.what());
    }
    
}
template<class Data, int size>
inline int Array<Data, size>::Size() const{ return size; }
Ошибка C2760 синтаксическая ошибка: ожидался токен ";", а не "идентификатор" Project2
Ошибка C7510 "iterator": при использовании зависимого имени тип необходимо указать префикс "имя типа" Project2
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2019, 01:19
Ответы с готовыми решениями:

В шаблонном классе, один из параметров которого контейнер, объявить итератор этого контейнера
Собсно #include &lt;windows.h&gt; #include &lt;iterator&gt; #include &lt;vector&gt; using namespace std; template &lt;class T, template...

Реализовать двусвязный список (list), итератор (iterator) и константный итератор (сonst_iterator) для списка
не могу понять что должно быть результатом. может подскажете примеры? пожалуйста. Задание: Реализовать двусвязный список (list),...

Не могу объявить шаблонный класс
Здравствуйте, имеется шаблонный класс динамического массива: template&lt;typename T&gt; class DynamicArray { public: ...

13
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
12.07.2019, 01:43
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
initializer_list<Data>::iterator it;
Что насчёт
C++
1
std::initializer_list<Data>::iterator it;
?
0
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
12.07.2019, 01:55  [ТС]
nalbe666, ой, то что-то менял, забыл добавить обратно во время написания поста. В общем, всё равно не работает:
Ошибка C7510 "iterator": при использовании зависимого имени тип необходимо указать префикс "имя типа" Project2
Ошибка C2760 синтаксическая ошибка: ожидался токен ";", а не "идентификатор" Project2
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
12.07.2019, 02:25
Лучший ответ Сообщение было отмечено MJ_PRUTYG как решение

Решение

Тогда так:
C++
1
2
3
4
typename std::initializer_list<Data>::iterator it;
for (it = l.begin(); it != l.end(); ++it) {
...
}
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.07.2019, 09:26
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
необходимо указать префикс "имя типа"
Так переведенные на русский сообщения об ошибках - абсолютное зло.
Пока этот перевод остается на таком уровне, я не советую никому им пользоваться.
"имя типа" здесь следует читать как typename, как вам показали в ответе #4.
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
12.07.2019, 11:52  [ТС]
DrOffset, спасибо большое за ответ. А зачем typename перед объявлением чего-либо???? Первый раз такое вижу О_о
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.07.2019, 12:24
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
А зачем typename перед объявлением чего-либо????
Потому что имя iterator зависит от параметра шаблона. Из-за этого в общем случае компилятору не понятно, является ли имя iterator типом.
Приведу пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <class T>
struct some
{
    typedef T type; // здесь type - это тип
};
template <>
struct some<int> // специализация
{
    static void type() {} // здесь type - это функция
};
// в шаблонном контексте:
template <typename T>
void foo()
{
    typename some<T>::type i = T{}; // здесь компилятору надо знать, что type - это точно тип
    //.....
    
}
А вообще смотрите книгу "Шаблоны C++. Справочник разработчика." , - тема "Зависимые имена шаблонов".

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Первый раз такое вижу О_о
Вы же не думаете, что вы уже видели все на свете?
2
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
12.07.2019, 12:45  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы же не думаете, что вы уже видели все на свете?
Согласен, много чего еще не видел...
Спасибо за толковое объяснение и за книгу, то что-то тааак туго эти шаблоны идут...
0
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
13.07.2019, 20:35  [ТС]
DrOffset, вот всё пересмотрел еще раз, почитал и понял так: пишем typename, когда дальше будет идти какой-то тип данных(можем даже во всех случаях это делать), н-р: typename int b; - "говорим" программе, что после 'typename' будет какой-то и любых типов данных, а не что-то другое.
Я всё верно понял?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.07.2019, 20:57
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
можем даже во всех случаях это делать
Нет, не можем.
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Я всё верно понял?
Нет.
typename используется чтобы указать, что зависимое от параметра шаблона имя является типом.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
13.07.2019, 21:46
MJ_PRUTYG,
typename нужен там где он нужен.
в данном случае он нужен что бы однозначно выразить то, что мы имеем ввиду тип.
неоднозначность заключается в том, что синтаксис type<T>::name может означать много чего, как было показано выше.
и компилятор на момент обработки подобного кода "не знает" а будет ли type<T>::name типом т.к в зависимости от специализации может быть так, что это не тип либо такое имя может отсутствовать вообще.
чем является type<T>::name будет известно в момент инстанциирования шаблона но до этого дело и не доходит т.к "компилятор говорит: подожди... уточни чем является type<T>::name так как если это не тип, то это не рабочий код".
таким образом мы "уверяем" компилятор, что это тип, а это в свою очередь образует корректную и компилируемую конструкцию (при условии, что type<T>::name действительно является типом)
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
13.07.2019, 23:45  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
typename нужен там где он нужен.
я с этим согласен, просто привел пример, что мы можем(но не делаем(!)(это не имеет смысла, как я понимаю)) в "повседневном" коде явно указать:
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
typename int b;
Цитата Сообщение от Undisputed Посмотреть сообщение
в данном случае он нужен что бы однозначно выразить то, что мы имеем ввиду тип.
"мы имеем ввиду тип" - то есть, можем помимо типа иметь ввиду еще: вызов функции - например, а так явного "говорим", что дальше, исключительно тип данных - верно?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
13.07.2019, 23:58
MJ_PRUTYG,
Если это компилируется в студии, это ещё не значит что это корректный С++ код. Поверьте на других компиляторах.
MJ_PRUTYG,
У вызова функции нет подобного синтаксиса (обращение к имени функции != её вызов)
а насчёт того что дальше - тип данных, это верно

сори я с телефона, цитировать не удобно
но думаю понятно что о чем
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
14.07.2019, 01:46  [ТС]
Undisputed, да, я всё понял. Спасибо вам большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.07.2019, 01:46
Помогаю со студенческими работами здесь

Не могу объявить вектор в классе
Здравствуйте. Изучаю С++, пишу игру &quot;Покер&quot;.) Только начал и сразу столкнулся с проблемой. При объявлении массива стрингов с помощью...

Не могу объявить массив указателей на объект
Здравствуйте! Такой вопрос. При объявлении массива указателей на объект появляются 3 ошибки. void Cindex::merge(Ckey *A, int l, int m, int...

[C/C++]Не могу объявить static функцию в header файле.
Прочитал про static,и пытаюсь сделать функцию доступной только в пределах одного модуля.Поскольку функции вызывают друг друга(и ещё не...

Не могу объявить массив внутри main - ошибка при линковке
Доброго времени суток! Я начинающий в С++. Использую gcc в Ubuntu 13.04 x64 bit. Прохожу сейчас массивы. Заметил одну странность....

Особый итератор словаря. Итератор возвращающий нужные комбинации
Немогу разобраться, как написать итератор. У меня есть словарь, ключи это координаты, а значения это либо ноль, либо единичка (True и...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru