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

Итератор контейнера внутреннего класса шаблона - C++

Восстановить пароль Регистрация
 
konstantin314
Сообщений: n/a
30.06.2010, 12:53     Итератор контейнера внутреннего класса шаблона #1
Следующий код компилируется:
C++
1
2
3
4
5
struct A {
    struct B {};
    vector<B> vec;
    vector<B>::iterator it;
};
А следующий код не компилируется, причем проблема возникает только с созданием итератора, но не контейнера (error: expected `;' before "it")
C++
1
2
3
4
5
template <class T> struct A {
    struct B {};
    vector<B> vec;
    vector<B>::iterator it;
};
Как быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2010, 12:53     Итератор контейнера внутреннего класса шаблона
Посмотрите здесь:

C++ необходимо в шаблонном классе, один из параметров которого контейнер, объявить итератор этого контейнера
Итератор для собственного контейнера C++
как сделать, чтобы итератор указывал на определенный элемент контейнера C++
итератор для контейнера C++
Вызов метода внутреннего класса методом внешнего класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
30.06.2010, 13:30     Итератор контейнера внутреннего класса шаблона #2
C++
1
    typename vector<B>::iterator it;
konstantin314
Сообщений: n/a
30.06.2010, 13:38     Итератор контейнера внутреннего класса шаблона #3
Спасибо, это помогло!

Но хотелось бы уточнить следующее. Если я правильно понимаю, ключевое слово typename используется при неоднозначности разбора выражения компилятором. Но каков альтернативный разбор в данном случае?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
30.06.2010, 15:09     Итератор контейнера внутреннего класса шаблона #4
Поскольку данный идентификатор разбирается в составе шаблона, происходит упрощённая проверка синтаксиса. В частности, компилятор не раздёргивает упомянутый тип vector, а просто отмечает, что идёт выбор некоего имени из некоего пространства имён. Такие имена по умолчанию не считаются именами типов. Слово typename используется для заверения компилятора в том, что мы как раз-таки выбираем имя типа. Эта механика рассчитана прежде всего на параметры шаблона (ведь при описании шаблона мы ничего пока не знаем про то, какими типами он будет параметризован и ничего не знаем о природе идентификаторов, вынимаемых из параметра).
Полное создание и проверка типа, вложенной в него структуры, основанного на ней вектора и т.п. будет происходить во время инстанциации шаблона.
Yandex
Объявления
30.06.2010, 15:09     Итератор контейнера внутреннего класса шаблона
Ответ Создать тему
Опции темы

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