2010-12-06 59 views
3

Je rencontre des problèmes (c'est-à-dire, des erreurs de liaison) avec l'instanciation explicite d'un modèle de fonction. Sous Visual Studio, les liens du projet sont ok, seulement sous g ++/Unix, en utilisant Eclipse-CDT, le lien produit des erreurs.L'instanciation explicite du modèle de fonction échoue (g ++)

L'appel de fonction fait partie d'une bibliothèque statique liée à une bibliothèque dynamique dans un grand projet. L'architecture de la fonction est la suivante:

    modèle de fonction
  • déclarée (mais non mis en œuvre) à l'intérieur d'un espace de noms dans mon dossier MathUtils.h. L'un des arguments de la fonction est lui-même un struct template, qui est déclaré et implémenté dans ce fichier h (sous le même espace de noms).
  • la mise en œuvre de la fonction et l'instanciation est dans MathUtils.cpp.
  • l'appel de la fonction est dans someFile.cpp (qui bien sûr #include "MathUtils.h") qui est compilé & lié comme une partie d'une bibliothèque statique.

Ce qui me pousse (presque) fou, est que les erreurs de construction ne sont pas totalement reproductibles, et je soupçonne l'Eclipse est à blâmer (sauter peut-être quelques étapes, bien que je l'utilise clean project avant chaque construction).

Pendant environ une heure, la configuration de débogage a été créée sans erreurs, mais la version a échoué avec l'erreur de liaison undefined reference to.... Ensuite, pendant l'heure suivante, les deux configurations ont échoué. Ensuite, j'ai fait un petit projet, avec seulement les 3 fichiers mentionnés ci-dessus, et compilé à la fois depuis la ligne de commande et depuis Eclipse - pas d'erreur du tout. Maintenant Les deux configurations semblent lier ok.

Est-ce que quelqu'un a rencontré des problèmes similaires en utilisant l'Eclipse-CDT? Aucune suggestion?

EDIT: comme le problème n'est pas facilement (ou pas du tout) reproductible, je suppose qu'il sera difficile d'obtenir une réponse. Je vais mettre à jour si j'ai de nouvelles idées.

Répondre

-2

Je cite www.cplusplus.com

Parce que les modèles sont compilés en cas de besoin, cela force une restriction pour plusieurs fichiers
projets: la mise en œuvre (définition) d'une classe ou une fonction modèle doit être dans le même fichier que sa déclaration. Cela signifie que nous ne pouvons pas séparer l'interface dans un fichier d'en-tête séparé , et que nous devons inclure à la fois l'interface et l'implémentation dans tout fichier utilisant les modèles.

+3

Ce n'est pas vrai, cherchez 'instantiation' explicite. –

+0

Mon erreur - J'ai mal interprété les modèles de fonction pour les modèles de classe. – stackmate

+0

Ne citez pas cplusplus.com. Sérieusement. – Griwes

3

J'ai eu un problème similaire. Résolu en déplaçant l'instanciation après l'implémentation dans le .cpp avec l'implémentation de la classe.

myclass.hpp:

template <class T> 
class MyClass 
{ 
public: 
    MyClass(); 
    // other declarations 
}; 

MyClass.cpp:

#include "myclass.hpp" 

template <class T> 
MyClass<T>::MyClass() 
{ 
} 

template class MyClass<int>; 
template class MyClass<bool>; 
+0

En effet cela fonctionne! – namezero