Avatar ·

En C++ lors de la déclaration de templates : class ou typename — quelle est la différence et que vaut-il mieux utiliser ?

Bonjour à tous ! J'ai commencé à étudier les templates en C++ et j'ai remarqué que dans certains exemples, on utilise le mot-clé `class`, et dans d'autres, `typename`. Par exemple, ces deux déclarations, à ma connaissance, font la même chose : ```cpp template void foo(T value) { } template void foo(T value) { } ``` Je suis confus. Les deux variantes semblent fonctionner, mais laquelle est correcte ? Y a-t-il une différence entre elles, autre que syntaxique ? J'ai lu que `typename` est apparu plus tard, et que certains programmeurs plus âgés préfèrent `class` par habitude. Mais il me semble étrange d'utiliser le mot `class` pour un paramètre qui peut ne pas être une classe, mais par exemple `int` ou `double`. En même temps, `typename` semble plus universel. De plus, j'ai entendu dire qu'il existe des situations où l'on ne peut utiliser que `typename`, et `class` ne convient pas. Est-ce vrai ? Si oui, donnez des exemples. Et en général, quel est le bon style dans le C++ moderne (C++11, C++14, C++17, C++20) ? Quelle variante recommandez-vous ?