2017-06-30 2 views
0

J'ai deux classes qui sont ensemble dans une bibliothèque partagée.Classe de modèle dans la bibliothèque partagée fonctionnant uniquement avec l'instanciation implicite ET explicite

--- foo.h 
template <class T> 
class Foo 
{ 
    Foo(); 
    void doSomething(void); 
... 
}; 

--- foo.cpp 
#include "foo.h" 
#include "bar.h" 

template <class T> 
Foo:Foo() 
{ 
}; 

template <class T> 
void Foo::doSomething(void) 
{ 
}; 

// Here I put the explicit/implicit instantiations (see below) 

--- bar.h 
template <class T> 
class Bar 
{ 
... 
}; 

--- bar.cpp 
template <class T> 
class Bar 
{ 
... 
}; 

template class Bar<int>; 

Et une fonction principale qui utilise celles-ci:

#include "foo.h" 
#include "bar.h" 

int main(void) 
{ 
    Foo<Bar<int> > foobar; // Or Foo<int> foobar; for version 5 
    foobar.doSomething(); 
} 

Maintenant, pour faire ce travail que je veux instancier Foo. Il y a 5 façons j'essayé de le faire:

Version 1: instanciation explicite (ne fonctionne pas)

template class Foo<Bar<int> >; 

Version 2: la lumière Implicit instanciation (ne fonctionne pas)

void dummy(void){Foo<Bar<int> > foobar;} 

version 3: implicite instanciation (ne fonctionne pas)

void dummy(void){Foo<Bar<int> > foobar; foobar.doSomething();} 

version 4: instanciation implicite et explicite (wo RKS)

template class Foo<Bar<int> >; 
void dummy(void){Foo<Bar<int> > foobar; foobar.doSomething();} 

Version 5: L'instanciation explicite de type non (œuvres templated)

template class Foo<int>; // Works, if you change the main as well 

Pourquoi seule version 4 travail pour Foo<Bar<int> >? Pourquoi fonctionne Foo<int>, mais Foo<Bar<int> > pas? Pour ceux qui ne travaillent pas, j'obtiens des erreurs de 'référence indéfinie'. Le code est très simplifié et cela n'arrive pas avec un code aussi simplifié, mais il est assez difficile de décomposer le code au point où il ne fonctionne plus car il est intégré dans un projet plutôt complexe. Je cherche surtout des indices ici ce qui pourrait causer cela.

+0

On ne sait pas exactement ce qui "ne fonctionne pas", où obtenez-vous des erreurs de "référence non définie"? Vous ne pouvez pas simplement mettre le corps du template dans cpp et en faire une bibliothèque partagée. – VTT

+0

Je reçois la référence indéfinie pour le constructeur de 'Foo'. Je sais, c'est pourquoi je voulais utiliser l'instanciation explicite, mais ça ne semble pas fonctionner. – Shadowigor

Répondre

0

Ok, j'ai été capable de comprendre. Le problème était l'ordre de compilation. Bar<int> a été explicitement instancié, mais apparemment, cela s'est produit après l'instanciation explicite de Foo<Bar<int> > qui, d'une manière ou d'une autre, l'a empêché d'être instancié. Ajouter un autre template class Bar<int>; juste avant template class Foo<Bar<int> >; dans le même module a résolu le problème.