2008-11-09 8 views
1

Supposons que je code comme ceci:Comment surmonter la restriction GCC "Impossible de convertir l'argument du modèle '0' en 'Foo *'"?

template<class T, T initial_t> class Bar { 
    // something 
} 

et essayez de l'utiliser comme ceci:

Bar<Foo*, NULL> foo_and_bar_whatever_it_means_; 

GCC renfloue avec l'erreur (sur la ligne ci-dessus):

impossible de convertir l'argument du modèle '0' à 'Foo *'

J'ai trouvé ce fil: http://gcc.gnu.org/ml/gcc-help/2007-11/msg00066.html, mais je dois utiliser NULL dans ce cas (ok, je pourrais probablement refactor - mais ce ne serait pas trivial; Aucune suggestion?). J'ai essayé de surmonter le problème en créant une variable avec la valeur de NULL, mais GCC se plaint toujours que je passe la variable et pas l'adresse de la variable en tant qu'argument de modèle. Et la référence à une variable initialisée avec ctor par défaut ne serait pas la même que NULL.

Répondre

3

Repenser votre code est probablement le meilleur moyen de le contourner. Le fil auquel vous avez lié inclut une citation claire de la norme indiquant que cela n'est pas autorisé.

0

Avez-vous essayé:

Bar<Foo*, (Foo*)NULL> foo_and_bar_whatever_it_means_; 

?

ou reinterpret_cast (0)?

+0

les deux ne fonctionnent pas ... –

2

Il semble que ce soit le même problème que de passer un littéral de chaîne comme paramètre de modèle non-type: ce n'est pas autorisé. Un pointeur vers un objet est autorisé comme paramètre de modèle si l'objet a linkage externe: ceci pour garantir l'unicité du type.

0

@Dan Olson: il semble y avoir une solution de contournement assez facile.

Créez une classe parente avec un seul paramètre de modèle. Ajoutez une fonction virtuelle renvoyant T. Pour la classe de base, il doit être codé en dur sur NULL. Pour dériver la classe, il retournera le second paramètre du template.

2

Pour accepter Bar<Foo, NULL>, vous avez besoin

template <typename T, int dummy> class Bar; /* Declared but not defined */ 
template <typename T> class Bar <T,NULL> { /* Specialization */ }; 

depuis typeof (NULL) == int.

Questions connexes