Я знаю, что вопросы о синтаксисе аргументов шаблона по умолчанию задавались много.
Обычно ответ (синхронно с моим пониманием того, как это должно работать) заключается в использовании чего-то подобного:
template <class T = SomeDefault> class T1 {};
Недавно я хотел проверить, какая реализация карты использует Boost в своей mapped_vector
, И нашел следующий фрагмент:
template<class T, class A>
class mapped_vector:
Видимо, для аргумента нет привязки по умолчанию A
но, по-видимому, я также могу создать mapped_vector<int>
просто хорошо. Обвиосулы по умолчанию аргумент выводится как-то, но как?
редактировать: просто чтобы быть точным, я говорю о строке 279 в этот файл
Линия Вот (Ссылка @ 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 {};