web-dev-qa-db-fra.com

Arguments par défaut du modèle

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.

127
user633658

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.

157
Joseph Mansfield

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 .

33
Paolo M

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.

18
Andy Prowl

Vous n'êtes pas autorisé à le faire mais vous pouvez le faire

typedef Foo<> Fooo;

et ensuite

Fooo me;
17
g24l