JaileWiki

TipsAndTricksCPlusPlus

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes 38.107.191.85

Fonctions template


Dans une implémentation d'une fonction template, il est parfois nécessaire de redéclarer la fonction comme étant dans le package. Celà peut résoudre les erreurs étranges type "instanciation foirée car définition absente" alors que la définition est juste au dessus ! (Typiquement, on peut repérer ce problème par le fait que si on commente la définition ou pas, l'erreur ne change pas, ce qui prouve que la définition est ignorée). Un premier workaround est de mettre l'implémentation de la fonction directement dans le header (comme la STL, tout est dans les .h ...) mais je n'aime pas, c'est vraiment goret et contraire à la séparation interface / implémentation.

Est ce que ca ne serait pas un bug de GCC 3.4 ? Ca y ressemble fortement pour moi en tout cas ... Car le fait qu'il y ait un use namespace monpackage; au début ne change rien.

Example :
Header :

namespace monpackage {




}


Implementation:

namespace monpackage {


}


Ce qui me fait vraiment penser que c'est un bug, c'est que il faut le namespace monpackage et monpackage::mafonction ... alors que c'est clairement redondant dans ce cas précis. Autre chose que je ne comprends pas, ça n'a rien de systématique ! Des fois j'ai besoin de ce workaround, et des fois pas.

MISE A JOUR : Avec GCC 4.1, c'est corrige !

Types template


Simplement, ne pas oublier le mot clé typename pour déclarer le type d'une variable qui est paramétré.

Example :

typename vector< BezierCurveT<T> >::iterator i = vb.begin();


Méthodes parentes et templates


Autre mystère, dans une métaclasse héritant d'une autre métaclasse,


template <class T> class Plop {
}
template <class T> class Toto : public Plop<T> {
}


ne fonctionne pas ! Il faut


void methode2() { Plop<T>::methode(); }


Un autre probleme d'instanciation de templates


Dans le snippet suivant,


template<class K, class V> class EST_THash;
class EST_String
{
};
class EST_Regex
{
};
template<class K, class V>
class EST_THash {
private:
};
EST_Regex * EST_THash< EST_String, EST_Regex * >::Dummy_Value;
EST_String EST_THash< EST_String, EST_Regex * >::Dummy_Key;


cette instanciation ne fonctionne pas avec GCC (mais avec Solaris CC, oui ...). Il faut ecrire l'instanciation de la maniere qui suit :


template <> EST_Regex * EST_THash< EST_String, EST_Regex * >::Dummy_Value;
template <> EST_String EST_THash< EST_String, EST_Regex * >::Dummy_Key;

Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]