Классы. Шаблоны. Создать шаблон, наследование шаблона с параметром, наследование от параметра

Задание было:
1) создать шаблон
2) сделать наследование шаблона с параметром
3) сделать наследование от параметра

Первые два сделала с последним проблема, нигде не могу найти про это информации, что-то откапала, но не работает

ПОМОГИТЕ.

Шаблон параметр шаблона и наследование
Есть вот такой базовый класс, который описывает абстрактный доступ к контейнеру.

[Классы, Наследование, Шаблоны] Добавление записи в список
В данной программе используется наследование с применением шаблонов класса. В.

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.)
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и.

Определить иерархию рыб и рептилий (классы и наследование). Создать аквариум.
Аквариум. Определить иерархию рыб и рептилий. Создать аквариум. Посчитать общую.

Наследование и шаблоны
Не понимаю почему выдается ошибки, переменные а, b не объявлены в данном.

Наследование и шаблоны
Здравствуйте. У меня возникла проблема. Есть 4 класса: Father — абстрактный.

www.cyberforum.ru

Наследование шаблонов c++

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

Пусть у нас есть несколько базовых классов и классы, которые могут от них наследоваться.
Итак, имеем Base1, Base2, Base3 и классы Derived12, Derived23.

И есть некоторый класс Executor.

В этом примере использовать аргумент функции не будем, просто предположим, что метод operator() будет выполнять какие-то действия с переданным объектом.

Поведение метода operator() должно зависеть от базового класса параметра T. Просто специализировать шаблон базовым классом не получится, так как специализация не сработает для класса наследника. Значит, необходимо добавить второй аргумент шаблона, который будет некоторым флагом для специализации и, конечно же, хочется автоматически проверять наследование.

Решение есть, оно описано в книге А. Александреску «Современное проектирование на C++» в разделе «Распознавание конвертируемости и наследования на этапе компиляции». Идея состоит в использовании перегрузки функции принимающей разные типы параметров и возвращающей разные типы. Для определения типа Александреску использовал sizeof (в той редакции, что попалась мне в руки), но в стандарт C++11 был добавлен оператор decltype. Это избавляет от написания лишнего кода.

Итак, перепишем Executor с учетом выше сказанного и заодно добавим хоть какую-нибудь реализацию для метода operator():

Специализация класса Executor выполнена, осталось сделать автоматическую проверку на наследование. Для этого напишем перегруженную функцию selector. Её нет нужды реализовывать, так как она не будет вызываться. При получении типа результата вычислений оператором decltype сами вычисления не выполняются.

При «вызове» функции selector c передачей указателя на класс наследник, компилятор постарается выбрать лучший вариант. Если класс является наследником Base1 или Base3, то будет выбран соответсвующий метод, если класс наследуется от чего-то другого, то будет выбрана функция с переменным количеством аргументов.

Теперь о том, как это использовать:

На экран будут выведены строчки:

Для удобства и красоты вызов Executor::operator() можно обернуть в шаблонную функцию:

Получилось, вроде, неплохо. Теперь дополнительно специализируем поведение при наследовании от Base2. Не нужно даже специализировать класс Executor, достаточно добавить перезгрузку функции selector и попробовать скомпилировать. Компилятор выдаст сообщение с ошибкой, что он не может выбрать какой вариант функции selector использовать. Как разрешить такую ситуацию?

В первую очередь нужно определить какое поведение хотим получить когда класс одновременно унаследован от двух классов, которые влияют на поведение класса Executor. Рассмотрим некоторые варианты:

1. Один из классов более приоритен и второй игнорируем;
2. Для ситуации необзодимо специальное поведение;
3. Необходимо вызвать последовательно обработку для обоих классов.

Так как 3 пункт является частным случаем 2 пункта, то его рассматривать не будем.

Нужно чтобы функция selector могла распознать варианты с двойным наследованием. Для этого добавим второй аргумент, который будет указателем на другой базовый класс и рассмотрим задачу приняв, что при наличии родителей Base1 и Base2 более приоритетным является Base1, а при наличии Base2 и Base3 необходимо специальное поведение. В таком случае перегрузка функции selector и методо execute будут иметь вид:

Класс Base23 реализации не требует, так как он будет использоваться только для специализации шаблона. Для класса Base23 реализация может быть пустой, без реализации будет ошибка компиляции при определении перегруженного варианта функции selector. Функция selector стала принимать два параметра, если будет одновременное наследование от Base1, Base2 и Base3, то придется добавлять еще один аргумент.

Приведенный метод специализации поведения обработки объекта в зависимости от его базовых классов удобно использовать тогда, когда количество обрабатываемых вариантов мало. Например, если необходимо рассмотреть только случаи, когда класс наследуется от Base1, Base2 и Base3 одновременно, а для всех остальных случаях поведение будет одинаковым. Что касается пункта 3, когда при наличии нескольких базовых классов нужно вызвать последовательную обработку для каждого, то удобнее использовать списки типов.

Если по каким-то причинам нет возможности использовать компилятор с поддержкой стандарта C++11, то вместо decltype можно воспользоваться sizeof. Дополнительно нужно будет объявить вспомогательные классы для типов возвращаемых функцией selector. Важно, чтобы функция sizeof возвращала для этих классов разное значение. Шаблоный класс Executor в таком случае должен специализироваться не типом, а целочисленным значением. Выглядеть это будет примерно так:

Update: Аналогичное поведение можно реализовать при помощи std::enable_if, получается немного громоздко, но условия задаются более явно. (спасибо за дополнение Eivind и lemelisk)

Update2: В качестве аргументов функции selector можно использовать ссылки, тогда вызов Executor::operator() будет чуть более понятным.

m.habr.com

Наследование шаблонов c++

Играют-играют роль при наследовании. И я бы не назвал это препроцессингом. =)

Если базовый шаблонный класс зависит от шаблонных параметров наследника.

. то что бы из наследника достучаться до полей предка нужно писать:
Иначе в предке они видны не будут. Будут использоваться глобальные (если есть).

Откуда:
Сообщений: 1571

Ок то видимо только для gcc. Студия так не думает. Вот интересно это Студия что-то расширила или это так в новом стандарте будет ?

Студия даже такое кушает:
А gcc нет. =)

Откуда: Odessa
Сообщений: 6209

И в C++98/03 и в драфте C++0X:

In the definition of a class or class template, if a base class depends on a template-parameter, the base class
scope is not examined during unqualified name lookup either at the point of definition of the class template
or member or during an instantiation of the class template or member.

Т.е. MS не по стандарту делает.
GCC тоже так делал до 3.4, а потом привел в соответствие со стандартом.

Хотя я честно говоря не вижу никаких проблем с поиском имени при инстанцировании шаблона.
Или в С++ запрещено при инстанцировании шаблона менять семантику идентификаторов в зависимости от параметров инстанцирования?

Откуда:
Сообщений: 1571

Ну вроде можно не только менять семантику. Благодаря специализации классов можно в базовом шаблонном классе. в зависимости от параметров шаблона предоставлять совершенно другие поля-члены. или вообще предоставить пустой класс. Или, например, остановить компиляцию когда нас не устраивают шаблонные параметры для базового класса.

Вопрос в том, что перед инстанцированием класса-наследника должен быть полностью определен класс-предок. По идеи ?! Так с чего бы там не поискать наследуемые поля (данные, методы) ?

Откуда:
Сообщений: 812

Откуда:
Сообщений: 812

Откуда:
Сообщений: 1571

Все как обычными классами. Откуда вас терзают такие сомнения не понятно. =)

Нюанс только с доступом к полям-членам наследника через this-> (или Base::) описан выше. Да и то, только если шаблонные параметры предка зависят от шаблонных параметров наследника.

Откуда:
Сообщений: 1571

В 2008/2010 все это есть. И находится на том же месте. New Project-> MFC Application и полетели.

Только в 2008 нет MFC Class Wizard-а, он возвращается в 2010. Плюс, там MFC обновленный — по виду интерфейса он напоминает студию 2008 и современный офис. Т.е. названия классов чуть другие (типа CFrameWndEx), а так тоже самое.

Только, вроде, MFC не входит в бесплатную версию студии, но если у вас все лицензии. =)

Откуда:
Сообщений: 812

Все как обычными классами. Откуда вас терзают такие сомнения не понятно. =)

Нюанс только с доступом к полям-членам наследника через this-> (или Base::) описан выше. Да и то, только если шаблонные параметры предка зависят от шаблонных параметров наследника.

Откуда:
Сообщений: 812

В 2008/2010 все это есть. И находится на том же месте. New Project-> MFC Application и полетели.

Только в 2008 нет MFC Class Wizard-а, он возвращается в 2010. Плюс, там MFC обновленный — по виду интерфейса он напоминает студию 2008 и современный офис. Т.е. названия классов чуть другие (типа CFrameWndEx), а так тоже самое.

Только, вроде, MFC не входит в бесплатную версию студии, но если у вас все лицензии. =)

www.sql.ru

[C++][Наследование][Шаблоны] wtf?

Помогите разобраться, почему защищенный член val не наследуется? (http://ideone.com/Qn17V)

Пост не читал, но первый же коммент — явно правильный.

Кстати, а с чем связано такое поведение? Вроде бы проблем с областью видимости быть не должно. Или это gcc-specific?

> Кстати, а с чем связано такое поведение?

Очень не удобно кстати Так и не понял утверждения: Since the definition of a dependent base class is not known at that time .

Ну ё-маё. Был такой же тред совсем недавно:

а что конкретно непонятно?

похоже пора писать местный faq по С++ 🙂

Да все непонятно ) Этож gcc поведение, другие компи сваривают

> Так и не понял утверждения: Since the definition of a dependent base class is not known at that time .

Определение класса еще не известно на данный момент, Далее по тексту указана причина: «there may be specialisations of the base class template that have not yet been seen».

www.linux.org.ru

[C++] Наследование шаблонов

Есть класс List и его наследник SList, в List есть вложенный класс iterator.

в int main создаю объект SList и больше ничего. Компилятор при сборке ругается:

спасибо за ссылки! но либо я не понял, либо не то
если перед begin() и end() указать this->(или SList ), то получаю вот такую ругань

> получаю вот такую ругань

А если заменить

Суть в том, что в строке 27 нужен
operator=(const derived &)
а у тебя есть только
operator=(const base &)

получаю вот такое:

> получаю вот такое:

Тьфу, typename выпал из головы совсем 🙁

тогда опять ругается на operator= 🙁

> тогда опять ругается на operator= 🙁

Попробовал у себя, нет никакой ругани.

[code=cpp] ListNode * _pEnd, _pBegin; [/code]

вот из за этого я за рисовани звездочек рядом с именем переменной, а не рядом с именем типа

[code=cpp] ListNode *_pEnd, *_pBegin; [/code]

код автора распарсить анрил, тем более какой то выдранный из контекста кусок

блин, почему теги code не обрабатываются?

> вот из за этого я за рисовани звездочек рядом с именем переменной

Черт, что-то сегодня ляп на ляпе..

> почему теги code не обрабатываются?

Вместо ‘User line breaks w/quoting’ надо выбрать ‘LORCODE’:

www.linux.org.ru

Еще по теме:

  • Оплата госпошлины в судах рк Госпошлина в суд. Калькулятор госпошлины 2018 Нужна госпошлина в суд? Калькулятор госпошлины 2018 года: Ваш браузер не поддерживает плавающие фреймы! Размер государственной пошлины: 1. Подача искового заявления Имущественного характера, не […]
  • Фортепиано пособия Ноты для начинающих ДМШ - Фортепиано Самоучители Самоучители, пособия для начинающих, учащихся детских музыкальных школ Работа над фортепианной техникой Гаммы Гаммы и арпеджио Л.Борухзон, С.Морено Гаммы и арпеджио для фортепиано Н. […]
  • 2 сплошных штраф Пересечение сплошной и двойной сплошной линии разметки — штрафы в 2018 году Наказание за пересечение сплошной или двойной сплошной линии разметки затрагивает практически весь диапазон ответственности за нарушения ПДД и может быть от предупреждения […]
  • Гражданство получение болгарии Второе гражданство Болгарии Паспорт гражданина Республики Болгария является отличным документом для безвизовых поездок, а сама страна уже много лет (с 2007 года) является полноправным членам Евросоюза. Соответственно, болгарский паспорт позволяет […]
  • Основные правила дружбы Основные правила дружбы такие как я становятся рок звездами,сумасшедши­ ми, художниками,работни­ ками морга, да легче представить с лопатой за копанием могилы ну никак не любимыми девушками. Статус: offline — ленты друзей — избранное RE: Тест: […]
  • Президентский приказ Президентский полк Статьи об уникальном воинском подразделении. История Президентского полка 7 мая 2006 года Президентский полк Службы коменданта Московского Кремля ФСО России отмечает свой 70-ти летний юбилей. История части неразрывно связана с […]