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

Utilisation d'un membre de classe parente dans un template

4 réponses
Avatar
Yann Renard
Bonjour à tous,

j'ai découvert aujourd'hui la chose suivante : la directive "using" est
nécessaire pour utiliser un membre de classe parente dans un template...
le cas d'école :

-----------------------------------------------------------------------

template <class T>
class A
{
public:
int a;
};

template <class T>
class B : public A<T>
{
public:
B(void) { a=0; }
};

template <class T>
class C : public A<T>
{
public:
using A<T>::a;
C(void) { a=0; }
};

-----------------------------------------------------------------------

C compile alors que B ne compile pas... (avec GCC4, mais il semble que
ce soit un changement récent)

Ma question : pourquoi diable faut il mettre ce "using" ?
Merci de vos réponses

Yann Renard

4 réponses

Avatar
Jean-Marc Bourguet
Yann Renard writes:

C compile alors que B ne compile pas... (avec GCC4, mais il semble que
ce soit un changement récent)


Relativement recent.

Ma question : pourquoi diable faut il mettre ce "using" ?


Fait des recherches sur la recherche des noms en deux phases et les noms
dependants dans les archives du groupe.

C(void) { this->a = 0; }

est une alternative (ce qui fait que les templates c'est quasiment le seul
endroit ou j'utilise this); dans le cas donne, je me demande pourque A n'a
pas de constructeur qu'on appellerait avec la liste d'initialisation, je
suppose que l'exemple est trop simplifie.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Yann Renard
Jean-Marc Bourguet wrote:
Yann Renard writes:

C compile alors que B ne compile pas... (avec GCC4, mais il semble que
ce soit un changement récent)


Relativement recent.

Ma question : pourquoi diable faut il mettre ce "using" ?


Fait des recherches sur la recherche des noms en deux phases et les noms
dependants dans les archives du groupe.


Ok, je vais aller voir ça.

C(void) { this->a = 0; }

est une alternative (ce qui fait que les templates c'est quasiment le seul
endroit ou j'utilise this); dans le cas donne, je me demande pourque A n'a
pas de constructeur qu'on appellerait avec la liste d'initialisation, je
suppose que l'exemple est trop simplifie.


Exactement, c'était sans intérêt pour l'exemple ;)

Yann


Avatar
meow
Il me semble aussi que

template <class T>
class B : public A<T>
{
public:
B(void) { A<T>::a=0; }
};

fonctionne. Par contre

B(void) : A<T>::a(0) {}

ne fonctionne pas et je ne sais ni pourquoi ni comment écrire ça
correctement.
Avatar
Jean-Marc Bourguet
"meow" writes:

Il me semble aussi que

template <class T>
class B : public A<T>
{
public:
B(void) { A<T>::a=0; }
};

fonctionne. Par contre

B(void) : A<T>::a(0) {}

ne fonctionne pas et je ne sais ni pourquoi ni comment écrire ça
correctement.


Pas plus que

struct A { int a; };
class B : public A
{
public: B() : A::a(0) {}
};

ne va compiler. Il faut que A ait un constructeur et tu fais

template <class T>
class B : public A<T>
{
public:
B() : A<T>(0) {}
};

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org