QHash mit eigener Key class

Alles rund um die Programmierung mit Qt
Antworten
secreator
Beiträge: 4
Registriert: 23. April 2009 04:57

QHash mit eigener Key class

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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....
secreator
Beiträge: 4
Registriert: 23. April 2009 04:57

Beitrag 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!
Antworten