Problem mit "Two-Phase look-up"



  • Hallo,

    ich habe unten stehenden Code geschrieben, der unter g++ 3.0.1 anstandslos compiliert wird (auf einer HP-UX). Jetzt habe ich eine Linux-Maschine mit g++ 3.4.6, wobei die Fehlermeldung

    sample.c: In member function 'T C2<T>::PROC(T)':
    sample.c:19: error: 'c1i' was not declared in this scope

    Ausgegeben wird. In einem Forum nannte man mir als Hilfe, "this->c1i" anstelle von "c1i" in Zeile 19 zu verwenden. Der Grund sei, dass Version 3.4.6 die "two-phase lookup rule" akribischer prüft. Das hilft auch, nur muß ich diese sehr oft machen (der Code hier als Beispiel knapp zusammengefaßt). Weiterhin leuchtet es mir nicht ein, da c1i doch von C2 geerbt wird.

    Oder mache ich etwas grundsätzlich falsch? Ich hätte gern c1i weiterhin als Variable in C2, also z.B. kein Zugriff über eine inline-Funktion.

    Schonmal vielen Dank im Voraus!

    Gruß
    Oliver

    #include <stdarg.h>
    #include <stdlib.h>
    #include <stdio.h>

    using namespace std;

    template <typename T> class C1 {
    public:
    T c1i;
    C1() { c1i = 1.0; };
    ~C1() { };
    };

    template <typename T> class C2 : public C1<T> {
    public:
    T c2i;
    C2() { c2i = 1; };
    ~C2() { };
    T PROC(T x) { c1i = c2i; };
    };

    int main(int argc, char **argv)
    {
    C1<double> c1;
    C2<double> c2;

    return EXIT_SUCCESS;
    }



  • Hmm, ich sehe dein Problem nicht. Du musst this verwenden, weil du von einem Template erbst und nicht von einer konkreten Klasse.



  • Ich weiß zwar auch nicht genau was das Problem ist, aber mit fällt nur das auf:

    T PROC(T x) { c1i = c2i; };
    

    Das müsste nämlich so heißen:

    T PROC(T x) { C1<T>::c1i = c2i; };
    

    Hättest du keine Template-Klassen würde das so funktionieren, aber da c1i abhängig vom T ist musst du ihn mit vollem Namen erwähnen... ( Habe mir den letzten Teil mal so zusammen gereimt und weiß nicht ob das so richtig ist 😃 )


Anmelden zum Antworten