Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Template, membre static d'un type interne

3 réponses
Avatar
Vincent Jacques
Bonjour à tous,

je cherche à définir un membre static d'une class template, membre d'un type
interne à cette template.

// Définition d'un membre static: ça marche

class StandardClass1
{
static int s_Int;
};

int StandardClass1::s_Int;

// Définition d'un membre static d'un type interne: ça marche

class StandardClass2
{
class InsideClass {};
static InsideClass s_Inside;
};

StandardClass2::InsideClass StandardClass2::s_Inside;

// Définition d'un membre static d'une template: ça marche

template<typename T>
class TemplateClass1
{
static int s_Int;
};

template<typename T>
int TemplateClass1<T>::s_Int;

// Définition d'un membre static d'un type interne d'une template:
// ça NE marche PAS

template<typename T>
class TemplateClass2
{
class InsideClass {};
static InsideClass s_Inside;
};

// C'est ici que ça se corse:
// gcc renvoit l'erreur suivante:
// error: expected constructor, destructor,
// or type conversion before 'TemplateClass2'
template<typename T>
TemplateClass2<T>::InsideClass TemplateClass2<T>::s_Inside;

Je ne comprends pas mon erreur...

Je vous remercie d'avance pour toutes les informations que vous pourrez me
donner.
--
Vincent Jacques

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème"
Devise Shadocks

3 réponses

Avatar
fabien.chene
Vincent Jacques writes:

// Définition d'un membre static d'un type interne d'une template:
// ça NE marche PAS

template<typename T>
class TemplateClass2
{
class InsideClass {};
static InsideClass s_Inside;
};

// C'est ici que ça se corse:
// gcc renvoit l'erreur suivante:
// error: expected constructor, destructor,
// or type conversion before 'TemplateClass2'
template<typename T>
TemplateClass2<T>::InsideClass TemplateClass2<T>::s_Inside;
^


Il manque « typename » ici. TemplateClass2<T>::InsideClass est un nom
dépendant (de T), qui se réfère à un type.

Ce qui donne:

template<typename T>
typename TemplateClass2<T>::InsideClass TemplateClass2<T>::s_Inside;


--
Fab

Avatar
Franck Branjonneau
Vincent Jacques écrivait:

// Définition d'un membre static d'un type interne d'une template:
// ça NE marche PAS

template<typename T>
class TemplateClass2
{
class InsideClass {};
static InsideClass s_Inside;
};

// C'est ici que ça se corse:
// gcc renvoit l'erreur suivante:
// error: expected constructor, destructor,
// or type conversion before 'TemplateClass2'
template<typename T>
TemplateClass2<T>::InsideClass TemplateClass2<T>::s_Inside;


template<typename T>
typename TemplateClass2<T>::InsideClass TemplateClass2<T>::s_Inside;


Je ne comprends pas mon erreur...


Les noms dépendants ne sont pas des noms de types par défaut.

--
Franck Branjonneau

Avatar
Vincent Jacques
Fabien Chêne a écrit dans fr.comp.lang.c++:
template<typename T>
typename TemplateClass2<T>::InsideClass TemplateClass2<T>::s_Inside;


Merci beaucoup à vous-deux pour la rapidité de votre réponse.

À bientôt,
--
Vincent Jacques

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème"
Devise Shadocks