Seite 1 von 1

QHash mit eigener Key class

Verfasst: 27. April 2009 01:24
von secreator
Hi!

Ich versuche nun schon seit Stunden eine Hashmap mit eigener Key class zu nutzen. Ich habe alles so wie in der QT Docu implementiert.
Es kopiliert, aber der Linker schreit zum Schluss immer, dass er die zwei Functionen nicht findet.
Wenn ich die find() methode auf die hashmap auskommentiere dann kompiliert und linkt es ohne murren.

Hier der Linkerfehler:
../../../../Qt/2009.01/qt/include/QtCore/../../src/corelib/tools/qhash.h:(.text$_ZNK5QHashI14ConnectionItemPN9Rootcause7thQueueIP9TCPPacketEEE8findNodeERKS0_Pj[QHash<ConnectionItem, Rootcause::thQueue<TCPPacket*>*>::findNode(ConnectionItem const&, unsigned int*) const]+0xe): undefined reference to `qHash(ConnectionItem const&)'
../../../../Qt/2009.01/qt/include/QtCore/../../src/corelib/tools/qhash.h:(.text$_ZN9QHashNodeI14ConnectionItemPN9Rootcause7thQueueIP9TCPPacketEEE8same_keyEjRKS0_[QHashNode<ConnectionItem, Rootcause::thQueue<TCPPacket*>*>::same_key(unsigned int, ConnectionItem const&)]+0x29): undefined reference to `operator==(ConnectionItem const&, ConnectionItem const&)'
Header file connectionitem.h:

Code: Alles auswählen

class ConnectionItem
bool operator==(const ConnectionItem& c1, const ConnectionItem& c2);
unsigned int qHash(const ConnectionItem& item);

class ConnectionItem
{
private:
   int ip;
   int port;

public:
    ConnectionItem(int ip, int port);
    virtual ~ConnectionItem() {}
 
friend unsigned int qHash(const ConnectionItem& item)
friend bool operator==(const ConnectionItem& c1, const ConnectionItem& c2)
};
...und die cpp file connectionitem.cpp:

Code: Alles auswählen

#include "connectionitem.h"
#include <QHash>

unsigned int qHash(const ConnectionItem& item)
{
   return (qHash(item.ip) ^ qHash(item.port);
}

inline bool operator==(const ConnectionItem& c1, const ConnectionItem& c2)
{
  return (c1.ip == c2.ip && c1.port == c2.port);
}
So will ich die Hashmap benutzen:

Code: Alles auswählen

#include "connectionitem.h"
#include <QHash>
...
QHash< ConnectionItem, thQueue<TCPPacket*>* > connections_;
connections_.find(ConnectionItem(1,2));
Hatte schon jemand das gleiche Problem, oder kann mir weiterhelfen?
Danke im Vorraus,
Grüße, secreator

Verfasst: 27. April 2009 06:32
von Christian81
Welcher Compiler?
Wird connectionitem.cpp wirklich kompiliert?
Das Inlining des virtuellen dtors hat keinen Sinn und den operator==() würde ich eher in die Klasse verlagern, aber ansonsten sieht es ok aus.

Verfasst: 27. April 2009 08:32
von solarix
kann man das ("connectionitem.h") überhaupt compilen? Fehlt da nicht noch ein Semicolon nach der Forwarddeclaration:

Code: Alles auswählen

class ConnectionItem   <-------------- hier
bool operator==(const ConnectionItem& c1, const ConnectionItem& c2); 
[EDIT]
und auch nach den "friend"-Anweisungen....

Verfasst: 8. Mai 2009 19:39
von secreator
Das Semicolon war nur ein Tippfehler. Hab nicht alles direkt kopiert (Sorry dafür).
Das eigentliche Problem war, dass ich bei der forward declaration der beiden Funktionen den inline qualifier vergessen habe. Dadurch hat die Deklaration nicht eindeutig mit der Definition übereingestimmt und der Kompiler hat gemurrt.

Danke für die Hilfe!
Viele Grüße!