Problem mit Fibonacci Heap



  • du meinst fibonacci_heap_base<typename T>::node ?

    das wirft nen fehler: /fheap.cpp:27: error: template argument 1 is invalid



  • fr33way schrieb:

    du meinst fibonacci_heap_base<typename T>::node ?

    Nein, davor. Also

    template <typename T> inline typename fibonacci_heap_base<T>::node const* fibonacci_heap_base<T>::iterator::find_root(typename std::vector<node*>::const_iterator it) const
    


  • danke, das reduziert schon mal einen Teil der Fehlermeldungen.
    Was jetzt bleibt sind die:

    src/cex/pathfinder/fheap.cpp: In member function ‘void boost::fibonacci_heap<T, Comp>::add_root(typename boost::fibonacci_heap_base<T>::node*)’:
    src/cex/pathfinder/fheap.cpp:129: error: ‘m_roots’ was not declared in this scope
    src/cex/pathfinder/fheap.cpp: In member function ‘void boost::fibonacci_heap<T, Comp>::find_min() const’:
    src/cex/pathfinder/fheap.cpp:160: error: ‘m_size’ was not declared in this scope
    src/cex/pathfinder/fheap.cpp:164: error: ‘m_roots’ was not declared in this scope
    src/cex/pathfinder/fheap.cpp: In member function ‘void boost::fibonacci_heap<T, Comp>::cut(typename boost::fibonacci_heap_base<T>::node*)’:
    src/cex/pathfinder/fheap.cpp:182: error: ‘m_roots’ was not declared in this scope
    src/cex/pathfinder/fheap.cpp: In member function ‘void boost::fibonacci_heap<T, Comp>::decrease(typename boost::fibonacci_heap_base<T>::node*, const K&)’:
    src/cex/pathfinder/fheap.cpp:203: error: ‘m_roots’ was not declared in this scope
    src/cex/pathfinder/fheap.cpp: In member function ‘void boost::fibonacci_heap<T, Comp>::remove(typename boost::fibonacci_heap_base<T>::node*)’:
    src/cex/pathfinder/fheap.cpp:249: error: ‘m_roots’ was not declared in this scope
    src/cex/pathfinder/fheap.cpp: In member function ‘typename boost::fibonacci_heap_base<T>::node* boost::fibonacci_heap<T, Comp>::push(const T&)’:
    src/cex/pathfinder/fheap.cpp:274: error: ‘m_size’ was not declared in this scope
    src/cex/pathfinder/fheap.cpp: In member function ‘void boost::fibonacci_heap<T, Comp>::pop()’:
    src/cex/pathfinder/fheap.cpp:287: error: ‘m_roots’ was not declared in this scope
    src/cex/pathfinder/fheap.cpp:293: error: ‘m_size’ was not declared in this scope
    make: *** [fheap.o] Fehler 1
    

    Aber was ich nicht ganz verstehe, denn über die friend angaben dürfte das doch gar nicht auftreten? (Bzw weil fibonacci_heap ja direkt von fibonacci_heap_base erbt)

    gruß



  • IIRC musst du da explizit this-> schreiben, weil die Basisklasse eine Templateklasse ist.


  • Mod

    fibonacci_heap_base<T> ist eine abhängige Basis, die folglich bei der in der Templatedefinition von fibonacci_heap<T, Comp>::add_root nicht durchsucht werden kann.
    m_roots ist aber kein abhängiger Name und wird folglich bereits bei der Templatedefinition gebunden. Abhilfe wird dadurch geschaffen, dass m_roots durch einen abhängigen Ausdruck ersetzt wird (14.6.2.2/3):
    - durch Qualifizierung: fibonacci_heap_base<T>::m_roots, oder
    - durch explizite Verwendung von this: this->m_roots



  • hi,

    danke! das hat das problem gelöst.

    nun bleibe nur noch eine Kleinigkeit, das Programm kompiliert korrekt, aber beim linken kriege ich undefined references.

    ich erzeuge ein Objekt per

    boost::fibonacci_heap<Vertex<PTYPE>*, CompareDistance> remainingNodes;
    remainingNodes.push(someNode);
    

    Und im weiteren Programmverlauf erfolgen diverse weitere zugriffe

    search.cpp:(.text+0xc95): undefined reference to `boost::fibonacci_heap<proj::Vertex<double>*, proj::CompareDistance>::push(proj::Vertex<double>* const&)'
    search.cpp:(.text+0xcb1): undefined reference to `boost::fibonacci_heap<proj::Vertex<double>*, proj::CompareDistance>::top() const'
    search.cpp:(.text+0xd07): undefined reference to `boost::fibonacci_heap<proj::Vertex<double>*, proj::CompareDistance>::pop()'
    search.cpp:(.text+0x1b18): undefined reference to `boost::fibonacci_heap<proj::Vertex<double>*, proj::CompareDistance>::push(proj::Vertex<double>* const&)'
    search.cpp:(.text+0x1e7e): undefined reference to `boost::fibonacci_heap_base<proj::Vertex<double>*>::~fibonacci_heap_base()'
    search.cpp:(.text+0x2470): undefined reference to `boost::fibonacci_heap_base<proj::Vertex<double>*>::~fibonacci_heap_base()'
    collect2: ld returned 1 exit status
    make: *** [project] Fehler 1
    

    weiterhin danke für eure hilfe



  • Was für eine Ursache können denn diese Fehler haben? Der Code ist alt, aber älter als 2-Phase-Lookup sicher nicht, denn in der Parameterliste der ersten Methode (Zeile 27) schreibt er ja typename std::vector<node*>::const_iterator it . Hats da mal Änderungen gegeben?


  • Mod

    Templatedefinitionen nicht im Header platziert, dafür eine Menge überflüssige inlines.



  • hat noch einer eine idee zu meinem linker problem?

    Es sind ja lediglich Dateien die im cpp file definiert worden. ich nutze autotools zum erstellen eines Makefiles, in die Makefile.am habe ich meine neue cpp Datei eingetragen.

    gruß



  • Das liegt, wie camper richtig bemerkt, stumpf daran, dass die gesamte Klassenvorlage dem Compiler bekannt sein muss, damit er sie für scc_cex::Vertex<double>* konkretisieren kann. Sofern du nicht auf explicit instantiation zurückgreifen willst, muss die gesamte Template in den Header; eine Aufspaltung in Header und Quellcodedatei, wie man sie andernfalls kennt, ist mit Templates nicht möglich.



  • Hi,

    danke, hatte leider die eine Antwort nicht so verstanden.

    Das hat auf jeden Fall mein Problem behoben und die Sache läuft.

    Also Danke für Eure Hilfe.

    gruß


Anmelden zum Antworten