Dans une DLL, j'ai une classe non modèle exportée avec une classe de base modèle. Cette classe de base modèle a une variable membre statique. J'utilise le membre de base statique dans un exécutable qui se lie à la DLL avec la classe non modèle exportée.
Dans de nombreux scénarios, j'obtiens des symboles externes non résolus ou des plaintes sur une liaison incohérente. J'ai trouvé un scénario qui fonctionne, mais il semble être bricolé, donc je me demande s'il y a une meilleure façon de faire et si cette meilleure façon peut également pointer vers des lacunes dans le compilateur/lieur C++ de VS2010 SP1.
Il s'agit du scénario minimal de la DLL que j'ai pu distiller - je ne pense pas pouvoir enlever quoi que ce soit ici sans casser le scénario.
// Fichier en-tête
template
class _MYDLL_EXPORTS TBaseClass
{
public:
static const double g_initial_value;
};
class _MYDLL_EXPORTS MyClass : public TBaseClass
{
};
// Bricolage : utilisez ce code uniquement lors de la construction de la DLL, pas lors de son inclusion
// depuis le client de la DLL
#ifdef _MYDLL
template
const double TBaseClass::g_initial_value = 1e-5;
#endif
// Fichier CPP
#include "header.h"
// Instanciation explicite du modèle pour le bon paramètre.
template class TBaseClass;
Ensuite, l'utilisateur de la DLL
#include
#include
int main(void) {
MyClass c;
std::cout << c.g_initial_value;
return 0;
}