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 erkenntp.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 typedeftypedef 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?