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

Создание шаблона - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Заменить элементы главной диагонали матрицы на нули http://www.cyberforum.ru/cpp-beginners/thread582343.html
Заменить элементы главной диагонали на нули
C++ int to string с разделением на разряды Как перевести целое 123456789 в строку "123 456 789"? http://www.cyberforum.ru/cpp-beginners/thread582334.html
Класс: Реализация через битовое поле класса "Множество" C++
Реализация через битовое поле. Как сделать ввод и вывод множества и так чтобы элементы хранились в отсортированном порядке? #include <iostream> #include<stdexcept> using namespace std; ...
Потоки контейнеры C++
Ребят, всем привет, помогите пожалуйста задачу решить плз Создать функцию разархивации файлов. Несколько файлов были слиты в один следующим образом: сначала идут названия всех файлов и их размеры,...
C++ Найти максимальный элемент списка и поменять его местами с первым элементом http://www.cyberforum.ru/cpp-beginners/thread582288.html
Информационное поле эл-та стека числовое. Найти максимальный эл-т списка и поменять его местами с первым элементом. Вот есть код программы но он неработает. #include <iostream> #pragma hdrstop...
C++ open serial port windows Можно ли открыть com port на windows используя функцию open("COM3", O_RDWR)? Важно не использовать CreatFile или OpenFile. подробнее

Показать сообщение отдельно
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 16:56
нужно смотреть в сторону зависимых имен типов в шаблонах.
вот тут вроде кое-что написано:
http://tortuga.angarsk.su/fb2/myerss..._C.fb2_20.html

...

Вложенные зависимые имена могут стать причиной затруднений на этапе синтаксического анализа исходного текста компилятором. Например, предположим, что мы реализуем print2nd еще более глупо, написав в начале такой код:

template <typename C> // печатает второй элемент контейнера
void print2nd(const C& container) // это некорректный C++!
{
C::const_iterator *x;
...
}

Выглядит так, будто мы объявили x как локальную переменную – указатель на C::const_iterator. Но это только видимость, поскольку мы «знаем», что C::const_iterator является типом. А что, если в классе C есть статический член данных по имени const_iterator и что, если x будет именем глобальной переменной? В этом случае приведенный код не будет объявлять локальную переменную, а окажется умножением C::const_iterator на x! Звучит невероятно, но это возможно, и авторы синтаксических анализаторов исходного кода на C++ должны позаботиться обо всех возможных вариантах входных данных, даже самых сумасшедших.
Пока о C ничего не известно, мы не можем узнать, является ли C::const_iterator типом или нет, а во время разбора шаблона print2nd компилятор ничего о C не знает. В C++ предусмотрено правило, разрешающее эту неопределенность: если синтаксический анализатор встречает вложенное зависимое имя в шаблоне, он предполагает, что это не имя типа, если только вы не укажете это явно. По умолчанию вложенные зависимые имена не являются типами. Есть исключение из этого правила, о котором я расскажу чуть ниже.
Имея это в виду, посмотрите опять на начало print2nd:

template <typename C>
void print2nd(const C& container)
{
if (container.size() >= 2) {
C::const_iterator iter(container.begin()); // предполагается, что
... // это не имя типа

Теперь должно быть ясно, почему это некорректный C++. Объявление iter имеет смысл только в случае, если C::const_iterator является типом, но мы не сообщили C++ об этом, потому C++ предполагает, что это не так. Чтобы исправить ситуацию, мы должны сообщить C++, что C::const_iterator – это тип. Для этого мы помещаем ключевое слово typename непосредственно перед ним:

template <typename C> // это корректный С++
void print2nd(const C& container)
{
if (container.size() >= 2) {
typename C::const_iterator iter(container.begin());
...
}
}

Общее правило просто: всякий раз, когда вы обращаетесь к вложенному зависимому имени в шаблоне, вы должны предварить его словом typename (скоро я опишу исключение).

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