c++ und templates



  • template<typename type> class a {
      public:
        class c { };
        template<typename type2> class b {
          a<type>::c* d;
        };
    };
    
    int main(void) {
      return 0;
    }
    

    compiliert problemlos.

    template<typename type> class a {
      public:
        class c { };
        template<typename type2> class b {
          a<type2>* d;
        };
    };
    
    int main(void) {
      return 0;
    }
    

    das auch.

    template<typename type> class a {
      public:
        class c { };
        template<typename type2> class b {
          a<type2>::c* d;
        };
    };
    
    int main(void) {
      return 0;
    }
    

    fehlermeldung:
    test.cc:5: error: syntax error before `*' token
    test.cc:6: confused by earlier errors, bailing out

    warum geht das dritte nicht? ich seh keine logische begründung.



  • typename vergessen?
    typename a<type>::c* d;

    Denn so wie ich das sehe ist a<type>::c ein abhaengiger Name...



  • a<type>::c* d;
    a<type2>* d;
    

    sind die weniger abhängig?
    abgesehen davon, darf man das typename nicht in der form verwenden. so weit ich weiß...



  • user123 schrieb:

    a<type>::c* d;
    a<type2>* d;
    

    sind die weniger abhängig?

    Jein.
    Der erste Name ist auch abhängig, der zweite nicht.
    Nur "qualified names" (Scope zu dem der Name gehört wurde explizit über :: oder -> angegeben) können abängig sein. a<type2> ist aber kein qualified name.
    Die obere Version von d erfüllt aber alle Kriterien eines abhängigen Namens.

    Korrekt wäre das ganze so:

    template<typename type> class a {
      public:
        class c { };
        template<typename type2> class b {
          typename a<type>::c* d;  // <- Hier
        };
    };
    

    2 ist ok.
    Und:

    template<typename type> class a {
      public:
        class c { };
        template<typename type2> class b {
          typename a<type2>::c* d; // <- Hier
        };
    };
    

    abgesehen davon, darf man das typename nicht in der form verwenden. so weit ich weiß...

    Dann weißt du falsch. Man darf das typename nicht nur hier verwenden, man muss es strenggenommen sogar.


Anmelden zum Antworten