Question

Dans Visual C ++, je peux faire des choses comme ceci:

template <class T>
class A{
protected:
    T i;
};

template <class T>
class B : public A<T>{
    T geti() {return i;}
};

Si j'essaie de compiler cela en g ++, j'obtiens une erreur. Je dois faire ceci:

template <class T>
class B : public A<T>{
    T geti() {return A<T>::i;}
};

Ne suis-je pas censé faire le premier en C ++ standard? Ou est-ce que quelque chose de mal configuré avec gcc me donne des erreurs?

Était-ce utile?

La solution

Cela était autorisé auparavant, mais modifié dans gcc 3.4 .

Dans une définition de modèle, les noms non qualifiés ne trouveront plus les membres d'une base dépendante (comme spécifié par [temp.dep] / 3 dans la norme C ++). Par exemple,

    template <typename T> struct B {
      int m;
      int n;
      int f ();
      int g ();
    };
    int n;
    int g ();
    template <typename T> struct C : B<T> {
      void h ()
      {
        m = 0; // error
        f ();  // error
        n = 0; // ::n is modified
        g ();  // ::g is called
      }
    };

Vous devez associer les noms, par exemple. en les préfixant avec this- > ;. Voici la définition corrigée de C :: h,

    template <typename T> void C<T>::h ()
    {
      this->m = 0;
      this->f ();
      this->n = 0
      this->g ();
    }

Autres conseils

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top