web-dev-qa-db-fra.com

Initialisation de membre statique dans un modèle de classe

J'aimerais faire ceci:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};

mais je ne peux pas depuis something_relevant n'est pas de type intégral. Cela ne dépend pas de T, mais le code existant dépend de sa qualité de membre statique de S.

Puisque S est un modèle, je ne peux pas mettre la définition dans un fichier compilé. Comment résoudre ce problème?

130
Alexandre C.

Il suffit de le définir dans l'en-tête:

template <typename T>
struct S
{
    static double something_relevant;
};

template <typename T>
double S<T>::something_relevant = 1.5;

Comme il fait partie d’un modèle, le compilateur s’assure qu’il n’est défini qu’une fois.

167
sbi

Ça va marcher

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;
31
Prasoon Saurav

Depuis C++ 17, vous pouvez maintenant déclarer le membre statique à inline, ce qui définira la variable dans la définition de la classe:

template <typename T>
struct S
{
    ...
    static inline double something_relevant = 1.5;
};

live: https://godbolt.org/g/bgSw1

17
xaxxon