Frage

In Visual C ++, ich kann wie folgt durchführen:

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

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

Wenn ich versuche, dies in g ++ zu kompilieren, erhalte ich einen Fehler. Ich habe dies zu tun:

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

Soll ich nicht das erstere in Standard C ++ tun? Oder ist etwas falsch konfiguriert mit gcc, die mir Fehler ist zu geben?

War es hilfreich?

Lösung

Die verwendeten erlaubt zu werden, aber geändert in gcc 3.4 .

In einer Template-Definition werden nicht qualifizierte Namen nicht mehr Mitglieder einer abhängigen Basis finden (wie durch [temp.dep] / 3 in dem C ++ Standard). Zum Beispiel:

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

Sie müssen die Namen abhängig machen, z.B. indem man sie mit this- prefixing>. Hier ist die korrigierte Definition von C :: h,

    template <typename T> void C<T>::h ()
    {
      this->m = 0;
      this->f ();
      this->n = 0
      this->g ();
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top