Pb DLL et template

axiagame Messages postés 8 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 18 août 2011 - 30 oct. 2007 à 16:18
axiagame Messages postés 8 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 18 août 2011 - 4 nov. 2007 à 14:05
Bonjour, je suis en train de tenter de créer une DLL, mais malheureusement je suis heurté à un problème :

Je souhaite créer une fonction en template qui renvoie un pointeur vers T, mais j'ai une erreur de compilation :

la fonction
template<typename T> T __declspec(dllexport) nouveau(T* ptr, char* file, int line);
fonctionne à la compilation,

mais la fonction
template<typename T> T* __declspec(dllexport) nouveau(T* ptr, char* file, int line);
ne fonctionne pas, le compilateur me dit "erreur de synthaxe : __declspec(dllexport)";

je comprends pas ce qu'il se passe, si je fais avec int et int* c'est le même problème

pouvez-vous m'aider?

6 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
30 oct. 2007 à 16:59
Le code template est généré uniquement à la compilation autrement dit le code générique que tu écris au-dessus n'existe que virtuellement; ainsi tu ne peux pas exporter de templates.
Y a tout de même un mot-clé prévu pour fair ca  dans la norme C++, export, mais il n'est supporté par aucun compilateur à ma connaissance pour l'instance.

Ton erreur vient de la position de __declspec(dllexport), faut le mettre avant le type.
La question serait plutôt : comment ca se fait que ca compile? Franchement j'en sais rien.
0
axiagame Messages postés 8 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 18 août 2011
30 oct. 2007 à 17:32
la réponse a ta question est que je développe avec visual studio 2005...

il faut mettre le declspec avant le type tu dis??? c'est bizarre je l'ai toujours mis après et ca a toujours marché... enfin j'essaye et je te tiens au courant

merci
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
30 oct. 2007 à 17:40
Bon tu m'as inquiété j'ai vérifié, je le mets toujours avant (pour les fonctions du moins  les classes c'est une autre affaire). Non le truc que je trouve étrange c'est que normalement on ne peut pas exporter une fonction template, et là ca compile parfaitement... peut-être que ca ne marche pas après.
0
axiagame Messages postés 8 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 18 août 2011
30 oct. 2007 à 17:55
eh bien je vais vérifier tout cela...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
2 nov. 2007 à 01:48
Il faut surclasser :

class XXXX;

// fonction exportée de la DLL
__declspec( dllexport ) const XXXX* GetNewXXXXInstance()
{
    return new XXXXDLL<ZYYYY>();
}

avec XXXXDLL qui derive de XXX, avec une XXXXDLL bien "branlée" (excuses !) il ne reste que du  ZYYYY comme si c'était l'objet.

:D
0
axiagame Messages postés 8 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 18 août 2011
4 nov. 2007 à 14:05
auh... désolé, mais peux-tu être plus clair stp, je ne saisis pas ce que tu expliques...

juju12 :
en fait effectivement, cela se compile, car dans la DLL il pourrait y avoir des fonctions qui utiliseraient la fonction template. Mais si je génère mon exécutable avec la DLL et que j'utilise un template, ça plante. Avec du recul ca me paraîssait logique :S

J'avais un autre problème, c'est que quand j'utilisai iostream la génération de la DLL plantait car j'étais obligé de mettre une option multithread et non DLL de débogage multithread (moteur graphique oblige) et les fonctions malloc et calloc ne pouvaient être résolues. Ce problème est réglé car le .h du moteur contient ces fonctions adaptées.

Dernier détail : y a t-il moyen d'appeler le constructeur d'une classe sans faire de new ou sans déclarer un objet de cette classe?

ex :
ma_classe * ptr;
ptr = (ma_classe*)malloc(sizeof(ma_classe));
// appel du constructeur sur ptr
0
Rejoignez-nous