Si je suis autorisé à faire ce qui suit:
template <typename T = int>
class Foo{
};
Pourquoi ne suis-je pas autorisé à faire ce qui suit en main?
Foo me;
Mais je dois préciser ce qui suit:
Foo<int> me;
C++ 11 a introduit les arguments de modèle par défaut et, pour le moment, ils sont difficiles à comprendre.
Tu dois faire:
Foo<> me;
Les arguments de template doivent être présents mais vous pouvez les laisser vides.
Pensez-y comme une fonction foo
avec un seul argument par défaut. L'expression foo
ne l'appellera pas, mais foo()
l'appellera. La syntaxe des arguments doit toujours être là. Ceci est cohérent avec cela.
Avec C++ 17, vous pouvez en effet.
Cette fonctionnalité s'appelle déduction d'argument de modèle de classe et ajoute davantage de souplesse à la façon dont vous pouvez déclarer des variables de types modèles .
Alors,
template <typename T = int>
class Foo{};
int main() {
Foo f;
}
est maintenant code C++ légal .
Vous pouvez utiliser les éléments suivants:
Foo<> me;
Et ayez int
votre argument de template. Les parenthèses angular angulaires sont nécessaires et ne peuvent pas être omises.
Vous n'êtes pas autorisé à le faire mais vous pouvez le faire
typedef Foo<> Fooo;
et ensuite
Fooo me;