Как работают аргументы шаблона по умолчанию?

Я знаю, что вопросы о синтаксисе аргументов шаблона по умолчанию задавались много.

Обычно ответ (синхронно с моим пониманием того, как это должно работать) заключается в использовании чего-то подобного:

template <class T = SomeDefault> class T1 {};

Недавно я хотел проверить, какая реализация карты использует Boost в своей mapped_vector, И нашел следующий фрагмент:

template<class T, class A>
class mapped_vector:

Видимо, для аргумента нет привязки по умолчанию Aно, по-видимому, я также могу создать mapped_vector<int> просто хорошо. Обвиосулы по умолчанию аргумент выводится как-то, но как?

редактировать: просто чтобы быть точным, я говорю о строке 279 в этот файл

4

Решение

Линия Вот (Ссылка @ Xeo) объявляет шаблон.
Строка в вашей ссылке определяет Это. Примечание: вы не может уточнить снова по умолчанию в определении, если вы решили иметь объявление.

Это работает: (версия Boost)

template<typename T = int> class A;
template<typename T> class A {};

Это не сработает:

template<typename T = bool> class A;
template<typename T = int> class A {};

Это ни:

template<typename T = int> class A;
template<typename T = int> class A {};

Обратите внимание, что вы должны объявить это в или один. Это работает:

template<typename T> class A;
template<typename T = int> class A {};

Хотя значение по умолчанию может быть объявлено только один раз, все они не должны быть объявлены в одной и той же части. Это работает, но, пожалуйста, не делайте этого:

template<class T, class U = bool> class A;
template<class T = int, class U> class A {};

… Без ограничений, правда. Это работает: (виню — или благодарю — @Xeo)

template<class T, class U, class V = double> class A;
template<class T, class U = bool, class V> class A;
template<class T = int, class U, class V> class A {};

И, конечно, вы не обязаны включать декларацию. Это работает:

template<typename T = int> class A {};
6

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector