IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GCC Discussion :

[GCC] erreur compilation avec dérivation + template


Sujet :

GCC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9
    Points : 21
    Points
    21
    Par défaut [GCC] erreur compilation avec dérivation + template
    Bonjour,

    Je viens de passer de Windows a Linux et donc de VC++ a gcc et je suis etonné de voir que le code suivant compile avec VC++ mais pas avec gcc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    template <class X>
    class A
    {	
    protected:
    	int i;
    };
     
    template <class X>
    class B: public A<X>
    {
    puclic:
    	void f() {	i=0;}
    };
    L'erreur est : "error: `i' undeclared (first use this function)" (sur la ligne "void f() { i=0;}"). Si on enleve les templates ca marche evidemment, de meme si on ecrit:
    Mais je trouve cette dernière solution un peu pénible. Aurais-je loupé quelque chose ? Il y a-t-il une option mistique de gcc a activer ?

    Vorl

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Je soupçonne que c'est ce point du standard qui requiert que l'on écrive "this->i" au lieu de juste "i".
    GCC est plus respectueux que VC là dessus.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9
    Points : 21
    Points
    21
    Par défaut
    Oui, avec le this-> ca marche et c'est vraiment indispensable pour gcc visiblement (car A<X>::i ne peut pas etre caste en int visiblement donc ca generait d'autres erreurs de compile). J'avais pas l'habitude de cette notation (qui alourdi pas mal je trouve) mais je vais m'y mettre.
    Sinon c'est vrai que gcc est plus "respectueux" pour pas mal de choses : j'ai des dizaines d'autres types d'erreur de compile.
    En tout cas, merci bien !

    Vorl

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    'using' est encore plus pratique que 'this->i'.
    Le problème est similaire avec:
    -une fonction membre héritée
    -les types déclarés dans la classe mère. Dans ce cas il faut redefinir le type avec un 'typedef'.


    Ton problème vient effectivement d'une histoire de standard, GCC est bien plus strict que VC et ICL. Et franchement cette restriction est vraiment énervante. Les premières versions 3.X de GCC donnaient des warnings. Depuis la version 3.3, c'est considéré comme une erreur.

    Ca vient du fait que GCC analyse autant que possible les codes des classes templates, même sans instance.
    Quand les types et variables sont sensés provenir d'une classe mère elle-même template, GCC n'a aucun moyen de déterminer si il sagit d'une variable ou d'un type. Donc il faut l'aider en lui donnant quelques indications.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <class X> 
    class B: public A<X> 
    { 
      typedef A<X> base;
      typedef typename base::value_type value_type;
      using base::i;
      using base::une_fonction;
    };

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur compilation avec Makefile
    Par 30avril1989 dans le forum Systèmes de compilation
    Réponses: 0
    Dernier message: 24/03/2011, 15h33
  2. [ORACLE] Erreurs Compilation avec connexion BDD
    Par oliviernouhi dans le forum SGBD
    Réponses: 8
    Dernier message: 02/02/2011, 10h54
  3. ERREUR COMPILATION AVEC PCW
    Par beetS dans le forum Windows
    Réponses: 0
    Dernier message: 01/04/2008, 19h19
  4. Erreur compilation avec Code Blocks
    Par Ulver dans le forum wxWidgets
    Réponses: 3
    Dernier message: 10/04/2007, 22h26
  5. Erreur compilation avec <string>
    Par seal3 dans le forum SL & STL
    Réponses: 9
    Dernier message: 25/08/2005, 20h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo