Announcement

Collapse
No announcement yet.

typename für iterator in einer Klasse ohne Wirkung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • typename für iterator in einer Klasse ohne Wirkung

    Hallo,

    Folgende Situation:
    Ich habe eine Template Klasse X in dieser wird ein std::vector verwendet.
    Für den Besseren zugriff werden iteratoren verwendet.

    statt immer zu schreiben
    Code:
    std::vector<type*>::iterator
    wollte ich gern innerhalb der klasse folgendes nutzen
    Code:
    template<typename type>
    class X
    {
         public:
             typename std::vector<type*>::iterator         value_type;
    
             value_type find(int x);
    };
    So nun aber spuckt mein compiler folgende fehlermeldung aus:
    value_type bezeichnet keinen typ.


    Hat einer ne Idee woran das liegen könnt grübele schon seit 3 Tagen daran aber keine sinnvolle lösung kam dabei raus.

  • #2
    Only use the keyword typename in template declarations and definitions

    Deine Klasse ist kein Template...

    Macht auch keinen Sinn, da du den Iterator mehrfachverwenden kannst
    Christian

    Comment


    • #3
      an sich schon irgendwie klar, aber der gcc verlangt da nach, die Meldung sieht dann so aus wenn ich es nicht benutze:

      Fehler: vor »std::vector<MetaType*>::iterator« ist »typename« erforderlich, da »std::vector<MetaType*>« ein abhängiger Gültigkeitsbereich ist
      Zuletzt editiert von ExOfDe; 05.07.2012, 19:37.

      Comment


      • #4
        Hab es scheinbar gelöst das rätsel!

        lag daran das man seit längerem wohl nun "typedef typname ..." benutzt statt wie ich nur "typedef" oder nur "typname" wobei letzteres allein falsch ist.

        Und die Fehlermeldung wo verlangt wird das typename benutzt werden soll galt nur für definition. da ist einiges an entwicklung an mir vorbei gegangen... früher war das einfacher

        Comment


        • #5
          Danke für die Rückmeldung
          Christian

          Comment


          • #6
            verschachtelte Abhängigkeiten in Templates

            Hallo ExOfDe,

            bei verschachtelten Abhängigkeiten in Templates hat der Parser vor der Instanziierung keine Informationen über den eingeschachtelten Datentyp. Daher muss man angeben, ob es sich um einen Datentyp oder um eine Variable handelt.
            Dieser Code lässt sich kompilieren:
            Code:
            // x.cpp
            
            #include <vector>
            
            template< typename Type >
            class X{
            public:
                typedef typename std::vector<Type>::iterator iterator_type;
                iterator_type it;
                typename Type::someType *ptr;
            };
            
            int main( int argc, char *argv[] ){
                return 0;
            }
            
            [219]> g++ -v
            Thread model: posix
            gcc version 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
            [220]> g++ x.cpp -o x
            [221]>
            Falls ich die Klasse X nun mit einen Datentyp instanziiere, in dem kein Datentyp "someType" deklariert ist, entdeckt der Parser den Fehler:
            Code:
            // x.cpp
            
            #include <vector>
            
            template< typename Type >
            class X{
            public:
                typedef typename std::vector<Type>::iterator iterator_type;
                iterator_type it;
                typename Type::someType *ptr;
            };
            
            class Y{
            public:
                int val;
            };
            
            int main( int argc, char *argv[] ){
                X<Y> myX;
                return 0;
            }
            
            [221]> g++ x.cpp -o x
            x.cpp: In instantiation of `X<Y>':
            x.cpp:19:   instantiated from here
            x.cpp:10: error: no type named `someType' in `class Y'
            [222]>
            Und jetzt wieder ohne Fehler:
            Code:
            // x.cpp
            
            #include <vector>
            
            template< typename Type >
            class X{
            public:
                typedef typename std::vector<Type>::iterator iterator_type;
                iterator_type it;
                typename Type::someType *ptr;
            };
            
            class Y{
            public:
                typedef int someType;
                someType val;
            };
            
            int main( int argc, char *argv[] ){
                X<Y> myX;
                return 0;
            }
            [222]> g++ x.cpp -o x
            [223]>
            Siegfried

            Comment

            Working...
            X