2009-11-21 16 views
1

Je suis en train de faire quelque chose comme ceci:Arguments de modèle partiellement défaillants utilisant typedefs?

template <typename T,bool Strong=true> 
class Pointer {...}; 

template <typename T> 
typedef Pointer<T,false> WeakPointer; 

Mais ceci est une erreur de compilation (VC « un modèle de typedef est illégal »). J'essaie d'éviter cela en utilisant l'héritage, car c'est un travail plus inutile (constructeurs de réécriture, opérateur =, coulée de va-et-vient, amitié ...).

Des idées?

Répondre

2

C++ 03 ne prend pas en charge les polices typées. Il faudrait préciser les deux types:

typedef Pointer<int,false> WeakIntPointer; 

Je sais que ce n'est pas très utile, mais il est une réalité de la langue. Heureusement, C++0x prendra en charge les typedesfs de modèle. Pour l'instant, vous devez vraiment créer une classe WeakPointer basée sur un modèle qui prend un paramètre template pour indiquer le type.

7

C++ 0x va résoudre ce problème, mais tel qu'il est, vous ne pouvez pas le faire.

Le travail autour commun est la suivante:

template <typename T,bool Strong=true> 
class Pointer {...}; 

template <typename T> 
struct WeakPointer 
{ 
    typedef Pointer<T,false> value_type; 
}; 

Ainsi, au lieu de:

typedef WeakPointer<int> WeakInt; 

Vous obtenez:

typedef WeakPointer<int>::value_type WeakInt;