Domanda

In Visual C ++, posso fare cose del genere:

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

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

Se provo a compilare questo in g ++, ricevo un errore. Devo fare questo:

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

Non dovrei fare il primo in C ++ standard? Oppure qualcosa non è configurato correttamente con gcc e mi sta dando errori?

È stato utile?

Soluzione

Questo era consentito, ma è stato modificato in gcc 3.4 .

In una definizione di modello, i nomi non qualificati non troveranno più i membri di una base dipendente (come specificato da [temp.dep] / 3 nello standard C ++). Ad esempio,

    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
      }
    };

Devi rendere dipendenti i nomi, ad es. prefissandoli con this- > ;. Ecco la definizione corretta di C :: h,

    template <typename T> void C<T>::h ()
    {
      this->m = 0;
      this->f ();
      this->n = 0
      this->g ();
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top