Если класс был предварительно объявлен ранее, вам не нужно будет пересчитывать параметры по умолчанию. Например:
// forward declare only
template <typename T = int, size_t N = 10>
struct array;
// actual definition
template <typename T , size_t N>
struct array
{};
int main(void)
{
array<> a; // uses the defaults it saw in the forward-declaration
}
Посмотрите выше фактического определения, чтобы узнать, объявили ли вы его вперед.
Кстати, если вы укажете значения по умолчанию в одном месте, а в другом - разные значения, вы получите ошибку компиляции:
template <typename T = int, size_t N = 10>
struct array;
// error: redefinition of default parameter
template <typename T = double , size_t N = 2>
struct array
{};
Попробуйте указать код, который вы нам показали, который по умолчанию не может совпадать, например:
struct stupid_special_tag_type_lolroflwat {};
template <
typename IteratorT = stupid_special_tag_type_lolroflwat,
typename NodeFactoryT = stupid_special_tag_type_lolroflwat,
typename T = stupid_special_tag_type_lolroflwat
>
struct tree_parse_info
{
// ...
};
Если вы получаете ошибки переопределения, вы знаете, что в других местах указаны значения по умолчанию.