Seite 1 von 1

Q_DECL_EXPORT und Template-Klassen

Verfasst: 10. November 2008 11:08
von AlGaN
Hallo,

ich habe ein Problem mit dem Exportieren von Template-Klassen beim Erstellen einer DLL (Projekt-Template LIB):
TEMPLATE=lib
[...]
QT += dll
[...]
Folgendes funktioniert:

Code: Alles auswählen

#ifdef MPOINT_H
#define MPOINT_H

#ifdef BUILD_LIB
#define EXPORT_LIB Q_DECL_EXPORT
#else
#define EXPORT_LIB
#endif

class EXPORT_LIB MPoint
{
[...]
};

#endif
aber selbiges mit einer Template-Klasse gibt einen Error (MS VC++ 2005 Express):

Code: Alles auswählen

#ifdef MPOINT_H
#define MPOINT_H

#ifdef BUILD_LIB
#define EXPORT_LIB Q_DECL_EXPORT
#else
#define EXPORT_LIB
#endif

template <typename T> class EXPORT_LIB MPoint
{
[...]
};

#endif
gibt den Fehler:
[...] MPoint.h(18): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'MPoint'
[...] MPoint.h(18): error C2470: "MPoint": Sieht wie eine Funktionsdefinition aus, es ist aber keine Parameterliste vorhanden; sichtbarer Funktionstext wird übersprungen.
[...]
Intern werden in der Qt-Lib doch auch Template-Klassen wie QHash<>, QList<> etc. exportiert, also müsste o.g. doch auch gehen, oder?

Muss ein Klassen-Template vor dem Export erst mit einem Typ T instanziiert werden?

Danke für alle Hinweise,
AlGaN

Verfasst: 10. November 2008 13:05
von solarix
und warum soll die template-Klasse exportiert werden? das ist ja zur compilezeit noch gar kein anwendbarer Typ.... erst eine konkrete Klasse (z.B. "MPoint<int>") koennte exportiert werden...

Verfasst: 10. November 2008 13:12
von AlGaN
Hi solarix,

danke für Deine Antwort,

ja, mir ist klar, dass ein Klassen-Template noch kein instanziierbarer Typ ist, jedoch scheint es intern in der Qt-Lib ja auch möglich zu sein (s. QList<T>, QHash<T> usw.), ich habe die Header mal genauer inspiziert, in der Qt-Lib scheinen sie einen Umweg über structs und d-Pointer zu gehen, vermutl. aus diesem Grund...

Was ich nicht verstehe: Was bringt mir Templates, wenn ich sie nicht in einer Lib deklarieren kann? In meinem Fall ist MPoint<T> eben eine Klasse für Punkte, deren Koordinaten-Typ zur Compile-Zeit eben noch nicht bekannt ist, er soll erst im die Lib benutzenden Code via

Code: Alles auswählen

MPoint<float>
oder

Code: Alles auswählen

MPoint<double>
spezialisiert werden.

Danke & Gruß,
AlGaN

Verfasst: 10. November 2008 13:17
von solarix
AlGaN hat geschrieben: ja, mir ist klar, dass ein Klassen-Template noch kein instanziierbarer Typ ist, jedoch scheint es intern in der Qt-Lib ja auch möglich zu sein (s. QList<T>, QHash<T> usw.), ich habe die Header mal genauer inspiziert, in der Qt-Lib scheinen sie einen Umweg über structs und d-Pointer zu gehen, vermutl. aus diesem Grund...
Falsch.. die structs muessen natuerlich exportiert werden (sind ja keine Templates)... aber das template selbst (!) nicht..
AlGaN hat geschrieben: Was ich nicht verstehe: Was bringt mir Templates, wenn ich sie nicht in einer Lib deklarieren kann? In meinem Fall ist MPoint<T> eben eine Klasse für Punkte, deren Koordinaten-Typ zur Compile-Zeit eben noch nicht bekannt ist, [...]
kannst du doch.. warum solltest du eine (Template-)Klasse ohne "declexport" nicht nutzen koennen? du siehst doch in der qlist.h, dass das Template "QList" ganz normal (also ohne den export-Kram) deklariert wird..