axiagame
Messages postés8Date d'inscriptionjeudi 18 août 2011StatutMembreDernière intervention18 août 2011
-
30 oct. 2007 à 16:18
axiagame
Messages postés8Date d'inscriptionjeudi 18 août 2011StatutMembreDernière intervention18 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
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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.
axiagame
Messages postés8Date d'inscriptionjeudi 18 août 2011StatutMembreDernière intervention18 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
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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.
axiagame
Messages postés8Date d'inscriptionjeudi 18 août 2011StatutMembreDernière intervention18 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