С++. Аргументы по умолчанию у шаблонов класса.

В шаблонах классов существует такое понятие, как Аргумент шаблона по умолчанию. В шаблонных функциях такого понятия нет, а вот в шаблонных классах есть. Работает это аналогично работе аргументов по умолчанию обычных функций, не шаблонных.

Вот параметры по умолчанию в шаблонных классах действуют точно по такому же принципу. Сейчас будет немного тяжеловато. Для примера выбраны контейнеры STL (в старых компиляторах STL нет), но более менее наглядно можно показать, используя STL. Я не хочу описывать 2 класса-велосипеда. Поэтому выбор для описания именно такой какой он есть.

Итак, делаю класс MyClass, внутри него я размещаю обычную функциональность для работы с вектором.
Вот основа для дальнейшего разбора. Это просто, чтобы видно было от чего отталкиваться.

Вот такой вот класс превратим в шаблонный класс и установим шаблонный аргумент по умолчанию для него.

Такой вот код . В начале шаблонному классу был скормлен только один параметр. Этот параметр пришел в первый аргумент, в T. Второй параметр мы не отдавали, но в шаблонном классе второй аргумент описан как аргумент по умолчанию, поэтому, если мы не отдаем в него параметров, он автоматически присваивает себе то значение, которое ему указано. Так, в этом примере, аргументу по умолчанию было указано, чтобы он принимал тип vector (Вектор, хранящий целые числа). Так и вышло, что в объекте класса MyClass1 образовался вектор для целочисленных значений и в него мы стали записывать данные.
Во втором же случае, вторым параметром, было указано, что второй параметр — это deque, хранящий данные тип у которых string, а следовательно во второй аргумент шаблонного класса пришел именно этот deque, он переписал тот тип, который был указан по умолчанию. Своего рода захватчик. Поэтому во втором случае в объекте класса образовалась очередь deque, хранящая данные, тип у которых string.

Попробуйте создать еще один объект

Так не получится, ни в первом случае, ни во втором.
В первом случае случае в очередь deque, которая хранит данные типа int идет попытка вписать данные, тип которых string.
Во втором случае мы передаем в контейнер данные, тип у которых string. Первый параметр приходит в аргумент Т, вторым параметром мы указываем, что данные будем записывать в deque, хранящую int. Получается, что идет попытка записи строк в контейнер, предназначенный для чисел, а отсюда ошибка. Т.е. нужно следить за обрабатываемыми данными.

В STL и у std::vector и у std::deque есть одноименный метод push_back(). Для тех, кто незнаком с STL и это не очень понятно, можете считать, что есть 2 класса. В этих обоих классах есть метод с одинаковым названием. Выполняет этот метод для одного класса одно, а для другого, соответственно другое. Как двигатели под капотом разных автомобилей. Общее у них только название. И вот, благодаря общему названию, и указанию аргумента по умолчанию, получается использовать либо метод первого класса, либо же метод второго класса. Это все зависит от того, указан ли параметр при вызове, который должен переписать аргумент шаблона, указанный по умолчанию или же не указан.

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

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     
Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

- Сынок, сходи в магазин? - А волшебное слово? - Отключу интернет! - Уже бегу!

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок