Ao repetir a declaração de uma classe de modelo com argumento padrão, recebo um erro:
<source>:12:23: error: redefinition of default argument for 'class<template-parameter-1-2>'
12 | template <typename T, typename = T>
| ^~~~~~~~
<source>:9:23: note: original definition appeared here
9 | template <typename T, typename = T>
|
Repetir uma declaração de template forward sem argumentos default não dá nenhum erro. Repetir a mesma, mas sem usar o argumento default também funciona (mas IMO não faz sentido e deve dar algum erro).
Aqui está o exemplo completo :
template <typename T>
struct ok;
template <typename T>
struct ok;
template <typename T, typename = T>
struct not_ok;
template <typename T, typename = T>
struct not_ok;
template <typename T, typename = T>
struct why_is_it_ok;
template <typename T, typename>
struct why_is_it_ok;
POR QUE?
Assim como os parâmetros padrão para parâmetros de função, os parâmetros padrão para parâmetros de modelo só podem ser definidos uma vez por escopo.
Está bom porque nenhuma declaração introduz um parâmetro padrão.
Não é permitido porque o segundo parâmetro sem nome é definido como padrão duas vezes no mesmo escopo.
É permitido porque apenas a primeira declaração declara um parâmetro padrão