Salut,
Le principe de base à savoir, c'est que tous les identifiants préfixés par un ou deux underscore (comme c'est le cas pour __gnu_cxx) sont des identifiants "réservé" à l'implémentation du compilateur, et que tu dois éviter d'y avoir recours.
Je crois même que c'est une obligation de la norme,même si, vu l'heure, je n'ai pas trop envie de vérifier 
Ainsi, l'espace de nom __gnu_cxx est principalement destiné à contenir (cf debug.h, c++config.h et autres hash_*.h)... l'espace de noms propre au débuggage de la stl (sous gcc, du moins) "__debug".
Tout cela pour dire qu'il vaut mieux ajouter les fichiers "standards" fournis par le technical report (TR1) en incluant les fichier hash_(map|set|table) qui se trouvent dans le dossier tr1 (et qui, pour le coup, sont accessible dans l'espace de noms tr1 qui est lui même dans l'espace de nom std).
Ceci étant dit, il est impossible de fournir une spécialisation partielle pour une classe template:
Seules les méthodes de classes template peuvent être spécialisées partiellement pour créer un trait de politique.
Si tu veux spécialiser toute la classe, il te faudra passer par une définition d'alias (typedef), selon un code proche de
typedef std::tr1::hash< IPvXAddress > IPVXhash;
Si, de fait, il est possible de découvrir dans le fichier <string> (ou du moins dans un des fichiers inclus dans string) une déclaration du genre de
1 2 3
| template<class charT>struct char_traits;
template <> struct char_traits<char>;
template <> struct char_traits<wchar_t>; |
c'est en fait qu'il s'agit de déclarations anticipées pour :
- une structure char_traits tout à fait template
- la structure char_traits utilisant spécifiquement des caractères
- la structure char_traits utilisant spécifiquement des caractères unicode
Partager