2011-02-17 4 views
0
template <class T> 
class PST_OBJECT_RECOGNITION_API test 
{ 
public: 
    T t; 

    inline bool operator==(const test & other) 
    { 
     return t == other.t; 
    } 
}; 

class PST_OBJECT_RECOGNITION_API test_int 
    : public test<int> 
{ 
}; 

Dans l'autre projet qui importe cette DLL j'ai cette erreurC++ modèles dll (erreur de liaison)

Error 3 error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __thiscall test<int>::operator==(class test<int> const &)" ([email protected]@@[email protected]@Z) referenced in function _main main.obj 

Comment puis-je résoudre ce problème?

Répondre

0

La solution semble être ce (suppression PST_OBJECT_RECOGNITION_API de la classe modèle):

template <class T> 
class test 
{ 
public: 
    T t; 

    inline bool operator==(const test<T> & other) 
    { 
     return true; 
    } 
}; 

class PST_OBJECT_RECOGNITION_API test_int 
    : public test<int> 
{ 
}; 
+0

Pensez-y, ma réponse a peut-être été un peu trompeuse (donc je l'ai supprimé). Une pensée, ce qui se passe dans votre code client lorsque vous écrivez "test x = new test_int"? – Jimmy

0

est la fonction instancié basé sur un modèle partout sur la DLL? Rappelez-vous que les définitions de templates sont générées à l'instanciation, quand il s'agit de classes, le compilateur génère la définition de classe (memory layout et autres), mais il peut choisir de ne pas générer toutes les méthodes si elles ne sont pas explicitement utilisées.

Essayez de dire au compilateur de instancier explicitement la fonction via

template bool test<int>::operator==(const test<int> &); 

Maintenant, puisqu'il est basé sur un modèle et marqué inline, il est probablement préférable qu'il soit défini dans l'en-tête.