Export dans une DLL d'une specialisation de methode d'une classe template.
5 réponses
Vincent DESVALS
Bonjour,
Je rencontre deux problemes sur VC++ 6.0 sous NT4.
1 : Est il possible d'exporter dans une DLL la spécialisation d'une
methode d'une classe template ?
2 : Qqu'un est il déjà tombé sur un "User Breakpoint at..." au cours d'un
chargement dynamique de DLL et mode Debug ?
Bonjour, Je rencontre deux problemes sur VC++ 6.0 sous NT4.
1 : Est il possible d'exporter dans une DLL la spécialisation d'une methode d'une classe template ?
Oui, une spécialisation explicite. Voire la KB 168958 pour un exemple.
Arnaud
dsl je suis nouveau c quoi la KB 168958?
KB = knowledge base dans MSDN. http://support.microsoft.com?kbid8958
Arnaud MVP - VC
Vincent DESVALS
"Arnaud Debaene" a écrit dans le message de news:408d4f9e$0$15661$
Vincent DESVALS wrote: > Bonjour, > Je rencontre deux problemes sur VC++ 6.0 sous NT4. > > 1 : Est il possible d'exporter dans une DLL la spécialisation d'une > methode d'une classe template ? Oui, une spécialisation explicite. Voire la KB 168958 pour un exemple.
Arnaud
Je parle bien d'exporter la specialisation d'une methode d'une classe template. Exemple :
Dans un Toto.h :
template <typename TITI> class EXPORTALAWINDOWS Toto { ... static int foo () { return 1 ; } } ;
Dans un Tata.h
class EXPORTALAWINDOWS Tata : public Toto<Tutu> { } ;
// La, la spécialisation de la methode foo de la classe template Toto ... static int Toto<Tutu>::foo () { return 2 ; }
Donc, Toto et Tata sont bien exportées mais static int Toto<Tutu>::foo () n'est pas présent dans les symbole exporté et donc UD...
Voilà.
"Arnaud Debaene" <adebaene@club-internet.fr> a écrit dans le message de
news:408d4f9e$0$15661$626a14ce@news.free.fr...
Vincent DESVALS wrote:
> Bonjour,
> Je rencontre deux problemes sur VC++ 6.0 sous NT4.
>
> 1 : Est il possible d'exporter dans une DLL la spécialisation d'une
> methode d'une classe template ?
Oui, une spécialisation explicite. Voire la KB 168958 pour un exemple.
Arnaud
Je parle bien d'exporter la specialisation d'une methode d'une classe
template. Exemple :
Dans un Toto.h :
template <typename TITI>
class EXPORTALAWINDOWS Toto
{
...
static int foo ()
{
return 1 ;
}
} ;
Dans un Tata.h
class EXPORTALAWINDOWS Tata : public Toto<Tutu>
{
} ;
// La, la spécialisation de la methode foo de la classe template Toto ...
static int Toto<Tutu>::foo ()
{
return 2 ;
}
Donc, Toto et Tata sont bien exportées mais static int Toto<Tutu>::foo ()
n'est pas présent dans les symbole exporté et donc UD...
"Arnaud Debaene" a écrit dans le message de news:408d4f9e$0$15661$
Vincent DESVALS wrote: > Bonjour, > Je rencontre deux problemes sur VC++ 6.0 sous NT4. > > 1 : Est il possible d'exporter dans une DLL la spécialisation d'une > methode d'une classe template ? Oui, une spécialisation explicite. Voire la KB 168958 pour un exemple.
Arnaud
Je parle bien d'exporter la specialisation d'une methode d'une classe template. Exemple :
Dans un Toto.h :
template <typename TITI> class EXPORTALAWINDOWS Toto { ... static int foo () { return 1 ; } } ;
Dans un Tata.h
class EXPORTALAWINDOWS Tata : public Toto<Tutu> { } ;
// La, la spécialisation de la methode foo de la classe template Toto ... static int Toto<Tutu>::foo () { return 2 ; }
Donc, Toto et Tata sont bien exportées mais static int Toto<Tutu>::foo () n'est pas présent dans les symbole exporté et donc UD...
Voilà.
Arnaud Debaene
Vincent DESVALS wrote:
Je parle bien d'exporter la specialisation d'une methode d'une classe template. Exemple :
Dans un Toto.h :
template <typename TITI> class EXPORTALAWINDOWS Toto { ... static int foo () { return 1 ; } } ;
Dans un Tata.h
class EXPORTALAWINDOWS Tata : public Toto<Tutu> { } ;
// La, la spécialisation de la methode foo de la classe template Toto ... static int Toto<Tutu>::foo () { return 2 ; }
Ce n'est pas une spécialisation explicite valide : Quand on spécialise une classe, on doit le faire pour toute la classe, pas pour juste une méthode. Exemple: //toto.h template <typename TITI> class Toto { static int foo () { return 1 ; } } ;
//tutu.h class Tutu {};
//spécialisation explicite de Toto template<> class __declspec(dllexport) Toto<Tutu> { static int foo () { return 2 ; } };
//classe dérivée de la spécialisation explicite class __declspec(dllexport) Tata : public Toto<Tutu> { } ;
Inclure tutu.h dans un fichier cpp compilé dans la DLL.
Symboles exportés par la DLL (démanglés): class Toto<class Tutu> & Toto<class Tutu>::operator=(class Toto<class Tutu> const &) int Toto<class Tutu>::foo(void) class Tata & Tata::operator=(class Tata const &)
Donc, Toto et Tata sont bien exportées
Toto ne peut pas être exportée (c'est un template). Par contre Toto<Tutu> est bien exportée, y compris foo. Tata est bien exportée
Arnaud MVP - VC
Vincent DESVALS wrote:
Je parle bien d'exporter la specialisation d'une methode d'une classe
template. Exemple :
Dans un Toto.h :
template <typename TITI>
class EXPORTALAWINDOWS Toto
{
...
static int foo ()
{
return 1 ;
}
} ;
Dans un Tata.h
class EXPORTALAWINDOWS Tata : public Toto<Tutu>
{
} ;
// La, la spécialisation de la methode foo de la classe template Toto
... static int Toto<Tutu>::foo ()
{
return 2 ;
}
Ce n'est pas une spécialisation explicite valide : Quand on spécialise une
classe, on doit le faire pour toute la classe, pas pour juste une méthode.
Exemple:
//toto.h
template <typename TITI> class Toto
{
static int foo ()
{
return 1 ;
}
} ;
//tutu.h
class Tutu
{};
//spécialisation explicite de Toto
template<> class __declspec(dllexport) Toto<Tutu>
{
static int foo ()
{
return 2 ;
}
};
//classe dérivée de la spécialisation explicite
class __declspec(dllexport) Tata : public Toto<Tutu>
{
} ;
Inclure tutu.h dans un fichier cpp compilé dans la DLL.
Symboles exportés par la DLL (démanglés):
class Toto<class Tutu> & Toto<class Tutu>::operator=(class Toto<class Tutu>
const &)
int Toto<class Tutu>::foo(void)
class Tata & Tata::operator=(class Tata const &)
Donc, Toto et Tata sont bien exportées
Toto ne peut pas être exportée (c'est un template). Par contre Toto<Tutu>
est bien exportée, y compris foo.
Tata est bien exportée
Je parle bien d'exporter la specialisation d'une methode d'une classe template. Exemple :
Dans un Toto.h :
template <typename TITI> class EXPORTALAWINDOWS Toto { ... static int foo () { return 1 ; } } ;
Dans un Tata.h
class EXPORTALAWINDOWS Tata : public Toto<Tutu> { } ;
// La, la spécialisation de la methode foo de la classe template Toto ... static int Toto<Tutu>::foo () { return 2 ; }
Ce n'est pas une spécialisation explicite valide : Quand on spécialise une classe, on doit le faire pour toute la classe, pas pour juste une méthode. Exemple: //toto.h template <typename TITI> class Toto { static int foo () { return 1 ; } } ;
//tutu.h class Tutu {};
//spécialisation explicite de Toto template<> class __declspec(dllexport) Toto<Tutu> { static int foo () { return 2 ; } };
//classe dérivée de la spécialisation explicite class __declspec(dllexport) Tata : public Toto<Tutu> { } ;
Inclure tutu.h dans un fichier cpp compilé dans la DLL.
Symboles exportés par la DLL (démanglés): class Toto<class Tutu> & Toto<class Tutu>::operator=(class Toto<class Tutu> const &) int Toto<class Tutu>::foo(void) class Tata & Tata::operator=(class Tata const &)
Donc, Toto et Tata sont bien exportées
Toto ne peut pas être exportée (c'est un template). Par contre Toto<Tutu> est bien exportée, y compris foo. Tata est bien exportée