Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Export dans une DLL d'une specialisation de methode d'une classe template.

5 réponses
Avatar
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 ?

Voila,

Merci.

5 réponses

Avatar
Arnaud Debaene
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
Avatar
giova
Arnaud Debaene wrote:

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




dsl je suis nouveau c quoi la KB 168958?
Avatar
Arnaud Debaene
giova wrote:
Arnaud Debaene wrote:

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




dsl je suis nouveau c quoi la KB 168958?



KB = knowledge base dans MSDN.
http://support.microsoft.com?kbid8958

Arnaud
MVP - VC
Avatar
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à.
Avatar
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