Могу ли я по умолчанию использовать шаблонный аргумент в предварительной декларации

Поэтому я пытаюсь понять, что происходит с Boost's ptree реализация.

В ptree.hpp basic_ptree на самом деле определяется:

template<class Key, class Data, class KeyCompare>
class basic_ptree

В ptree_fwd.hpp есть то, что выглядит как предварительное объявление basic_ptree но с новым аргументом шаблона по умолчанию:

template < class Key, class Data, class KeyCompare = std::less<Key> >
class basic_ptree;

И, наконец, в ptree_fwd.hpp ptree является typedef"D:

typedef basic_ptree<std::string, std::string> ptree;

Это предварительное объявление в ptree_fwd.hpp, верно? Итак, мне разрешено использовать аргумент шаблона по умолчанию в предварительном объявлении?

1 ответ

Решение

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

17,1/14

Набор стандартных аргументов шаблона, доступных для использования, получается путем объединения аргументов по умолчанию из всех предыдущих объявлений шаблона так же, как аргументы функции по умолчанию ( dcl.fct.default).

[ Пример:

template<class T1, class T2 = int> class A;
template<class T1 = int, class T2> class A;

эквивалентно

template<class T1 = int, class T2 = int> class A;

- конец примера]

А 17,1/16

Параметру шаблона не должны предоставляться аргументы по умолчанию двумя разными объявлениями в одной и той же области видимости. [ Пример:

template<class T = int> class X;
template<class T = int> class X { /* ... */ };  // error

- конец примера]

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

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

Я чувствую, что это становится действительно противным очень быстро. Что, если я включу 2 отдельных заголовка, которые включают различные значения по умолчанию в их предварительных декларациях? Или вы к этому обращаетесь?

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

Мое личное мнение было бы иметь только одну декларацию в заголовке, которая задает аргументы шаблона по умолчанию, а затем включать этот заголовок везде, где вам нужно объявление (и для определения также).

Другие вопросы по тегам