OVH Cloud OVH Cloud

g++ 3.4.2 et template

30 réponses
Avatar
docCarcass
Bonjour,
je rencontre un petit probl=E8me avec g++ 3.4.2.
Je dois compiler ce genre de code(qui n'est pas le mien) :

class Titi
{
protected :
int truc_;
public:
Titi():truc_(0){};
virtual ~Titi(){};
};

template<class T>
class Toto : public T
{
public:
void methode(void)
{
truc_++;
}
};

int main(int ac,char **av)
{
Toto<Titi> i;
i.methode();

return 0;
}

Cela compile avec g++ 3.3.4, icc 8.0 mais plus avec g++ 3.4.2 :

In file included from test.cc:1:
template.hh: In member function `void Toto<T>::methode()':
template.hh:16: erreur: =AB truc_ =BB non d=E9clar=E9 (premi=E8re utilisati=
on dans
cette fonction)
template.hh:16: erreur: (Chaque identificateur non d=E9clar=E9 est rapport=
=E9
seulement une seule fois pour la fonction dans laquelle il appara=EEt.)

Je comprend l'erreur mais s'agit-il d'un bug apparu recement dans g++ ou
alors d'un choix. S'il s'agit d'un choix existe-t-il une option pour
obtenir l'ancien comportement ?

Bien =E0 vous,
S=E9bastien

--

int main(){int j=3D1234,putchar();char t[]=3D":@abcdefghij-lmnopqrstuv"
"wxyz.\n",*i=3D"@jq:.pn.q:ibf.gd\noz.dn@ew\nlwh-i",*strchr();while(*i)
{j+=3Dstrchr(t,*i++)-t;j%=3Dsizeof t-1;putchar(t[j]);}return 0;}

10 réponses

1 2 3
Avatar
Jean-Marc Bourguet
docCarcass writes:

Bonjour,
je rencontre un petit problème avec g++ 3.4.2.
Je dois compiler ce genre de code(qui n'est pas le mien) :

class Titi
{
protected :
int truc_;
public:
Titi():truc_(0){};
virtual ~Titi(){};
};

template<class T>
class Toto : public T
{
public:
void methode(void)
{
truc_++;
}
};

int main(int ac,char **av)
{
Toto<Titi> i;
i.methode();

return 0;
}

Cela compile avec g++ 3.3.4, icc 8.0 mais plus avec g++ 3.4.2 :


g++ 3.4.2 a raison. Il faut utiliser

this->truc_++;

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
Vincent Lascaux
class Titi
{
protected :
int truc_;
public:
Titi():truc_(0){};
virtual ~Titi(){};
};

template<class T>
class Toto : public T
{
public:
void methode(void)
{
truc_++;
}
};

g++ 3.4.2 a raison. Il faut utiliser


this->truc_++;


Pour quelle raison ? Est ce du à l'utilisation de template ?

--
Vincent


Avatar
drkm
"Vincent Lascaux" writes:

g++ 3.4.2 a raison. Il faut utiliser

this->truc_++;


Pour quelle raison ? Est ce du à l'utilisation de template ?


Oui, et à la recherche de nom en deux phases. Il faut rendre le nom
dépendant du modèle.

À confirmer, mes connaissances sur le sujet étant limitées.

--drkm


Avatar
Christophe Lephay
docCarcass wrote:
class Titi
{
protected :
int truc_;
public:
Titi():truc_(0){};
virtual ~Titi(){};
};


En plus des réponses qui ont déjà été données, attention à ne pas terminer
les déclarations de tes fonctions membre par ";" comme c'est le cas
ci-dessus dans ton constructeur et ton destructeur.

Chris

Avatar
Jean-Marc Bourguet
"Vincent Lascaux" writes:

class Titi
{
protected :
int truc_;
public:
Titi():truc_(0){};
virtual ~Titi(){};
};

template<class T>
class Toto : public T
{
public:
void methode(void)
{
truc_++;
}
};

g++ 3.4.2 a raison. Il faut utiliser


this->truc_++;


Pour quelle raison ? Est ce du à l'utilisation de template ?


Un nom nom indépendant des paramètres templates (truc_ en
est un) est cherché dans le contexte de définition du
template. Ce qui permet aux compilateurs (j'ai vérifié avec
gcc 3.4.2 et como) de donner un message d'erreur avec
simplement:

template<class T>
class Toto : public T
{
public:
void methode(void)
{
truc_++;
}
};

sans qu'il y ait une instanciation quelque part.

Donc, pour que la recherche ait lieu aussi dans le contexte
d'instanciation, il faut rendre le nom dépendant. Pour
quelque chose qui devrait être un membre, le plus simple est
l'utilisation the this->.

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
drkm
Jean-Marc Bourguet writes:

Donc, pour que la recherche ait lieu aussi dans le contexte
d'instanciation, il faut rendre le nom dépendant. Pour
quelque chose qui devrait être un membre, le plus simple est
l'utilisation the this->.


Aurais-tu un exemple dans un autre cas ?

--drkm

Avatar
Jean-Marc Bourguet
drkm writes:

Jean-Marc Bourguet writes:

Donc, pour que la recherche ait lieu aussi dans le contexte
d'instanciation, il faut rendre le nom dépendant. Pour
quelque chose qui devrait être un membre, le plus simple est
l'utilisation the this->.


Aurais-tu un exemple dans un autre cas ?


La qualification par la classe de base (T::truc_), mais ça
peut poser problème pour des membres virtuels.

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
Christophe Lephay
Jean-Marc Bourguet wrote:
drkm writes:

Jean-Marc Bourguet writes:

Donc, pour que la recherche ait lieu aussi dans le contexte
d'instanciation, il faut rendre le nom dépendant. Pour
quelque chose qui devrait être un membre, le plus simple est
l'utilisation the this->.


Aurais-tu un exemple dans un autre cas ?


La qualification par la classe de base (T::truc_), mais ça
peut poser problème pour des membres virtuels.


Je crois que drkm parlait d'un autre exemple de problème, pas d'un autre
exemple de solution ;)

Chris



Avatar
James Kanze
"Christophe Lephay" writes:

|> docCarcass wrote:
|> > class Titi
|> > {
|> > protected :
|> > int truc_;
|> > public:
|> > Titi():truc_(0){};
|> > virtual ~Titi(){};
|> > };

|> En plus des réponses qui ont déjà été données, attention à ne pas
|> terminer les déclarations de tes fonctions membre par ";" comme
|> c'est le cas ci-dessus dans ton constructeur et ton destructeur.

Pourquoi ? C'est permis, même si ce n'est pas nécessaire.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
drkm
"Christophe Lephay" writes:

Jean-Marc Bourguet wrote:

drkm writes:

Jean-Marc Bourguet writes:

Donc, pour que la recherche ait lieu aussi dans le contexte
d'instanciation, il faut rendre le nom dépendant. Pour
quelque chose qui devrait être un membre, le plus simple est
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^




l'utilisation the this->.


Aurais-tu un exemple dans un autre cas ?


La qualification par la classe de base (T::truc_), mais ça
peut poser problème pour des membres virtuels.


Je crois que drkm parlait d'un autre exemple de problème, pas d'un autre
exemple de solution ;)


Tout juste. Plus précisément, lorsque l'on veut rendre dépendant
autre chose qu'un membre.

--drkm




1 2 3