2016-12-27 2 views
1

Comme les codes suivants, je voudrais utiliser un alias pour éviter l'écriture fastidieuse du membre statique de la classe interne NIL.Comment utiliser un alias du membre de la classe interne statique?

//in RBTree.hpp 
template <typename T, typename Comp> 
class RBTree{ 
public: 
    struct TreeNode{ 
     ... 
     static TreeNode* NIL = new TreeNode(); 
     ... 
    } 
} 

//in RBTree_IMPL.hpp 
template <typename T, typename Comp> 
using NIL = ??? 

Je veux utiliser le mot-clé « en utilisant » pour éviter l'écriture fastidieuse tels que:

//in BST.hpp 
template <typename T, typename Comp> 
class BST{ 
public: 
    struct TreeNode{ 
     ... 
    } 
} 

//in BST_IMPL.hpp 
template <typename T, typename Comp> 
using TreeNode = typename BST<T, Comp>::TreeNode; 

Comme ci-dessus, il sera simple. Donc, je veux trouver un moyen d'utiliser un membre interne statique comme ci-dessus. THX!

+0

'l'aide 'crée un alias de type. 'NIL' n'est pas un type, c'est un membre de classe statique. –

+0

euh, si je veux faire ça, que dois-je faire? – wind2412

+0

Créez une macro de clavier pour 'RBTree :: TreeNode :: NIL'. Notez que cela n'est nécessaire qu'en dehors de la portée des modèles. À l'intérieur du modèle, 'TreeNode :: NIL' suffira, ou juste' NIL' dans la portée de 'TreeNode'. Peut-être quelques 'typedef RBTree :: TreeNode', ici et là, vont diminuer la douleur. –

Répondre

1

using est utilisé pour créer un alias pour un type. Vous voulez créer un alias pour une variable, qui en C++ est une référence. Merci à C++ 14 de variables de modèle suivantes devrait fonctionner:

//in RBTree_IMPL.hpp 
template <typename T, typename Comp> 
auto& NIL = RBTree<T,Comp>::TreeNode::NIL; 

Btw .: Je ne pense pas que l'initialisation de NIL en classe fonctionnera comme vous montriez dans votre exemple, car il est pas constexpr. Vous devez probablement le définir et l'initialiser en dehors de la classe.

Edit:

Si vous êtes coincé avec un C++ 11 compilateur, le mieux que vous pouvez faire est de afaik utilisez une fonction qui renvoie une référence au pointeur:

template <typename T, typename Comp> 
auto NIL() -> typename RBTree<T,Comp>::TreeNode*& { 
    return RBTree<T,Comp>::TreeNode::NIL; 
} 

//usage e.g.: 
NIL<int,std::less<int>()-> ... 
+0

sentir désolé, la grammaire est juste mais il ne peut pas travailler, quand j'utilise NIL dans une autre fonction, j'ai eu des erreurs 'NIL' n'est pas déclaré dans cette portée. – wind2412

+0

merci tout de même! ~ – wind2412

+0

@ wind2412: S'il vous plaît poster le code exact, qui produit ce problème. Je donne du code à gcc6 et ça compile. – MikeMB