problem bei iterator initialisierung



  • hallo,

    und zwar habe ich folgendes problem: ich bekomme immer die fehlermeldung

    instantiated from `FGraph<T>::desc_iter::desc_iter(T*) [with T = Node]'

    (node ist die klasse die für das template einspringt)

    und hier der relevante code dazu:

    class desc_iter: 
    	public std::iterator<std::bidirectional_iterator_tag, T>{
    
    		friend class FGraph;
    		typedef FGraph<T> list_type;
    
    		typename std::vector<T*> children;
    	private:
    		list_type* my;
    		typename std::vector<T*>::iterator m_iter;
    
    	public:
    
    		desc_iter(T* x){
    			T* ptr = x;
    				my->getChildren(ptr,children);
    			}.......
    

    das ist die iterator klasse, die innerhalb der template klasse ist und void getChildren(T x,std::vector<T>x)** ist eine methode in der template klasse, aber ich will von der iterator klasse darauf zugreifen --> was mache ich falsch ,dass er mir immer bei "my->getChildren..." diese fehlermeldung bringt? ich rufe den iterator in der main so auf:

    FGraph<Human>::descendant_iter it3(&Mar);
    

    //(Mar = Zeiger auf ein Node objekt)

    hoffe ihr könnt mir helfen!

    lg



  • Ganze Meldung lesen! Die Fehlermeldung sagt nur aus, wo der fehlerhafte Code instanziert wurde. Der eigentliche Fehler kommt erst noch.



  • sry, das wäre mal der ganze build:

    **** Rebuild of configuration Debug for project beispiel 4 ****
    
    **** Internal Builder is used for build               ****
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -oFGraph.o ..\FGraph.cpp
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -oNode.o ..\Node.cpp
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -omain.o ..\main.cpp
    ..\FGraph.h: In instantiation of `FGraph<Node>::descendant_iter':
    ..\main.cpp:34:   instantiated from here
    ..\FGraph.h:154: error: `FGraph<T>::descendant_iter& FGraph<T>::descendant_iter::operator++() [with T = Node]' and `FGraph<T>::descendant_iter& FGraph<T>::descendant_iter::operator++() [with T = Human]' cannot be overloaded
    ..\FGraph.h: In member function `FGraph<T>::fwd_iter& FGraph<T>::fwd_iter::operator++(int) [with T = Node]':
    ..\main.cpp:29:   instantiated from here
    ..\FGraph.h:59: warning: reference to local variable `tIter' returned
    ..\FGraph.h: In constructor `FGraph<T>::descendant_iter::descendant_iter(T*) [with T = Node]':
    ..\main.cpp:34:   instantiated from here
    ..\FGraph.h:132: warning: unused variable 'ptr'
    Build error occurred, build is stopped
    Time consumed: 3860  ms.
    


  • ups sry hab da noch was dazugefügt und jetzt eine erweiterte version kompiliert - ist der falsche build -> das ist der richtige:

    **** Build of configuration Debug for project beispiel 4 ****
    
    **** Internal Builder is used for build               ****
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -omain.o ..\main.cpp
    ..\FGraph.h: In member function `FGraph<T>::fwd_iter& FGraph<T>::fwd_iter::operator++(int) [with T = Human]':
    ..\main.cpp:29:   instantiated from here
    ..\FGraph.h:59: warning: reference to local variable `tIter' returned
    ..\FGraph.h: In member function `void FGraph<T>::getChildren(T*, std::vector<T*, std::allocator<T*> >) [with T = Human]':
    ..\FGraph.h:135:   instantiated from `FGraph<T>::descendant_iter::descendant_iter(T*) [with T = Human]'
    ..\main.cpp:34:   instantiated from here
    ..\FGraph.h:176: warning: unused variable 'test'
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -oFGraph.o ..\FGraph.cpp
    g++ -obeispiel4.exe main.o Human.o FGraph.o
    Build complete for project beispiel 4
    Time consumed: 4547  ms.
    


  • Also Fehler sehe ich hier keine. Und die Warnungen lauten, wörtlich übersetzt:

    "FGraph.h:59: Referenz auf lokale Variable tIter wird zurückgegeben"
    "FGraph.h:176: Variable test wird nirgends benutzt"



  • eben, ich auch nicht ... :P, aber in eclipse wird immer diese zeile rot markiert und der code lässt sich einfach nciht ausführen:

    my->getChildren(ptr,children);
    


  • Also laut dem Build-Log war die Erzeugung der obeispiel4.exe erfolgreich. Dein Eclipse spinnt :p



  • hmm hab jetzt neugestartet, aber immer noch das selbe problem 😞

    ich hab jetzt das programm trotzdem ausgeführt, obwohl eclipse mich gefragt hat, ob trotz fehler bla ... und bekomme dann eine endlosschleife öÖ ... ich glaube es liegt an der methode:

    void getChildren(T* x,std::vector<T*> children){
    
    		T *myTPtrx = x;
    		bool found = false;
    		unsigned int myidx = 0;
    		T *test = myVec[myidx];
    		while((unsigned)myidx != myVec.size()){
    
    			if(myVec[myidx] == myTPtrx){
    				for(unsigned int i = 0;i<myVec.size();i++){
    					for(unsigned int j = 0;j<myVec.size();j++){
    						if((unsigned)myMap[i][j] == 1 && (i == myidx)){
    								children.push_back(myVec[j]);
    								std::cout<<"children "<<j<<" "<<myMap.size()<<" "<<myVec.size()<<std::endl;
    								myTPtrx = myVec[j];
    								found = true;
    							}
    
    					}
    				}
    			}
    			if(found){
    				myidx = 0;
    				found = false;
    			}
    			else{
    				myidx++;
    				}
    		}
    	}
    

    aber seltsamerweise funktioniert das ganze außerhalb der iterator klasse, aber nur nicht wenn ich das über die iteratorklasse aufrufe :((((



  • man ist das blöd, wenn man nicht registriert ist 😛 -> naja sry für den doppelpost, aber wollte noch hinzufügen, dass das prog ab hier abstürzt und es kommt eine windows "problem wurde festgestellt"-fenster:

    if(myVec[myidx] == myTPtrx){....
    


  • int0xicated schrieb:

    man ist das blöd, wenn man nicht registriert ist...

    DAS wäre ja nun schnell und preiswert zu ändern... :p 😉

    ..."FGraph.h:59: Referenz auf lokale Variable tIter wird zurückgegeben"...

    Dass der Compiler hier weitermacht, bedeutet aber nicht, dass alles in Ordnung sei.
    Das ist IMHO ein sehr gefährlicher Fehler, den man unbedingt ausmerzen sollte.

    Gruß,

    Simon2.



  • hmm aber wie kann ich den ausmerzen? ich brauch den titer für diese methode bzw. imkrement operator -> man machts ja auch so, glaub ich.

    fwd_iter &operator++(int){
    			if(m_iter==m_end)//edit
    				return(*this);
    			fwd_iter tIter = *this;
    			++m_iter;
    			return (tIter);
    		}
    

    aber habt ihr keine ahnung, weshalb das ding immer abstürzt? ich verzweifle nämlich schon fast und sollte eigentlich shcon fertig sein.

    lg



  • Gib halt keine Referenz zurück. Das erreichst Du sehr einfach, indem Du das & wegnimmst.



  • Hier stand Blödsinn...



  • so jetzt gebe ich im Konstruktor vom iterator eine referenz auf die hauptklasse fgraph mit und damit gehts ... wieso geht es sonst nicht? öÖ

    descendant_iter(T* x,FGraph& g){
    g.getChildren(x,children);
    m_end=children.end();
    m_iter=children.begin();

    }



  • Möglicherweise Zufall? Hast Du die Warnungen inzwischen korrigiert?

    Dir sollte auch klar sein, dass die Funktion getChildren das Argument children nicht verändert? (Call-By-Value)



  • int0xicated schrieb:

    ... wieso geht es sonst nicht? öÖ
    ...

    Eben weil Du eine Referenz auf ein lokales Objekt zurückgibst ... wie es die Warnung besagte.
    Mit einer "Warnung" sagt Dir der Compiler halt: "Das kann ich zwar verarbeiten ... aber ich bezweifele, dass da das rauskommt, was Du möchtest"
    Hier halt: "Du gibst eine Referenz zurück auf ein Objekt, dass nicht mehr existiert" => Ergo: Es wird "krachen", wenn Du darauf zugreifst. (@Forenpolizei: Jaja... ich weiß, es ist "undefiniert" - was nicht bedeutet, dass es "krachen" uss..... aber hier hat er offensichtlich das Glück, dass es "kracht").

    Gruß,

    Simon2.



  • ja, hab alle warnungen ausgebessert und wegen der call by value sache, da bin ich auch draufgekommen und habs ausgebessert. danke euch!


Log in to reply