probleme mit nested iterator



  • also, so sieht der code aus(stark gekürzt):

    //groupVector.hpp
    template<class Type,class Allocator=std::allocator<Type> >
    class groupVector{
        private:
            template<class Container_Type,class Traits>
            class group_iterator;
        public:
            typedef group_iterator<groupVector<Type,Allocator>,traits<Type> > iterator;
            iterator begin();
    };
    template<class Type,class Allocator=std::allocator<Type> >
    template<class Container_Type,class Traits>
    class groupVector<Type,Allocator>::group_iterator{
        //usw
    };
    #include "groupVector.cpp"
    
    //groupVector.cpp
    template<class Type,class Allocator=std::allocator<Type> >
    groupVector<Type,Allocator>::iterator groupVector<Type,Allocator>::begin(){
        //usw
    }
    //[C++ Error] groupVector.cpp(49): E2316 'groupVector<Type,Allocator>::begin()' is not a member of 'groupVector<Type,Allocator>'
    

    der fehler tritt nur bei methoden auf, die den iterator enthalten,ich habe schon den code mit einem funktionierenden verglichen,der das gleiche tut, und konnte keinen Unterschied feststellen.
    aufjedenfall finde ich den fehler nicht, is wahrscheinlich etwas so triviales, dass ihr es aufn ersten Blick erkennt 😉

    p.s: der fehler verschwindet, wenn ich die typedef zum test so umwandel:

    typedef int iterator;
    


  • template<class Type,class Allocator=std::allocator<Type> >
    typename groupVector<Type,Allocator>::iterator groupVector<Type,Allocator>::begin(){
        //usw
    }
    


  • hat sich nichts geändert



  • ähm, du benutzt den iterator, ohne ihn vorher zu definieren.



  • nein, daran liegts nicht...

    //deklaration
    template<class Container_Type,class Traits>
    class group_iterator;
    
    //definition
    template<class Type,class Allocator=std::allocator<Type> >
    template<class Container_Type,class Traits>
    class groupVector<Type,Allocator>::group_iterator{
        //usw
    };
    


  • Zum mitschreiben: du benutzt den iterator ohne ihn vorher zu definieren

    iterator begin();  //die Definition benötigt, vorher nur deklariert
    

    und erst danach folgt die Definition, alles klar?

    Funktionierender Code:

    template<class A, class B>
    class groupVector
    {
    public:
    	template<class,class>
    	class group_iterator
    	{
    	};
    
    	typedef group_iterator<A,B> iterator;
    
    	iterator begin();
    };
    


  • Shlo schrieb:

    Zum mitschreiben: du benutzt den iterator ohne ihn vorher zu definieren

    iterator begin();  //die Definition benötigt, vorher nur deklariert
    

    und erst danach folgt die Definition, alles klar?

    Funktionierender Code:

    template<class A, class B>
    class groupVector
    {
    public:
    	template<class,class>
    	class group_iterator
    	{
    	};
    
    	typedef group_iterator<A,B> iterator;
    
    	iterator begin();
    };
    

    dann nochmal für ganz dumme:
    wieso funktioniert das dann hier? 🙄



  • otze schrieb:

    dann nochmal für ganz dumme:
    wieso funktioniert das dann hier? 🙄

    für ganz dumme: es sollte 😃 🙄 Erst wenn ein Objekt einer Nested-Klasse definiert wird, die Defintion aber später folgt, spuckt der Compiler einen Fehler aus (zumindest VC).

    Nächster Versuch:

    typedef group_iterator<groupVector<Type,Allocator>,traits<Type> > iterator;
    

    Wo wird traits definiert?



  • traits.hpp
    und die is dabei^^



  • also:

    groupVector<Type,Allocator>::iterator//funktioniert nicht
    groupVector<Type,Allocator>::group_iterator<groupVector<Type,Allocator>,traits<Type> >//funktioniert nicht
    groupVector<Type,Allocator>::group_iterator//funktioniert, aber ich habe keine logische erklärung wieso,und nochne frage
    //ist es nun egal, was für ne version von dem iterator ich zurückgebe?
    

    //edit ne so ganz scheints wirklich nich zu funktionieren...

    [C++ Error] groupVector.cpp(50): E2285 Could not find a match for 'groupVector<int,allocator<int> > 
    ::[u]groupIterator<Container_Type,Traits>[/u]::groupIterator(groupVector<int,allocator<int> >::[u]groupIterator<Container_Type,Traits>[/u]&)'
    

    es fehlen die template parameter, hier ist sozusagen nur der rohbau



  • so, hab nu den nested iterator verworfen, aber der fehler bleibt!
    der iterator ist direkt über tree definiert, in tree steht immernoch der typedef

    typedef typename groupIterator<groupVector<Type,Allocator>,traits<Type> > iterator;
    

    so sieht die funktions deklaration aus

    iterator begin();
    

    so die definition

    template<class Type,class Allocator=std::allocator<Type> >
    groupVector<Type,Allocator>::iterator groupVector<Type,Allocator>::begin(){
        return iterator(this,0);
    }
    

    ich hab jetzt jede mir bekannte fehlerquelle aussortiert, und ich weis echt nichmehr, wonach ich noch suchen kann 😞
    //edit
    er scheint aber mit dem "groupVector<Type,Allocator>," in der typedef probleme zu haben,woran kann das liegen? macht es vielelciht probleme, dass die typedefs fast als erstes kommen?


Anmelden zum Antworten