2016-12-27 89 views
1

作爲以下代碼,我想使用別名來避免內部類NIL的靜態成員的繁瑣寫作。如何使用靜態內部類成員的別名?

//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 = ??? 

我想使用「使用」關鍵字,以避免繁瑣的寫作如:

//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; 

作爲上述,這將是簡單的。所以我想找到一個像上面那樣使用靜態內部成員的方法。謝謝!

+0

使用' '創建一個類型別名。 'NIL'不是一個類型,它是一個靜態類成員。 –

+0

恩,如果我想這樣做,我該怎麼辦? – wind2412

+0

爲'RBTree :: TreeNode :: NIL'創建一個鍵盤宏。請注意,這僅在模板範圍之外需要。在模板內部,'TreeNode :: NIL'就足夠了,或者''在'TreeNode'範圍內只是'NIL'。也許幾個'typedef RBTree :: TreeNode',在這裏和那裏,將減輕痛苦。 –

回答

1

using用於爲類型創建別名。您希望爲變量創建一個別名,該變量在C++中爲參考。由於C++ 14的模板變量以下應該工作:

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

順便說一句:我不認爲NIL的在級初始化將作爲你在你的例子表明,因爲它不是一個constexpr。你可能必須在類之外定義和初始化它。

編輯:

如果你被卡住一個C++編譯器11,你可以做AFAIK使用返回指針引用的函數最好的:

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

感到抱歉,語法正確但它不能工作,當我在其他函數中使用NIL時,出現錯誤'NIL'未在此範圍內聲明。 – wind2412

+0

謝謝你都一樣!〜 – wind2412

+0

@ wind2412:請發佈確切的代碼,這產生了這個問題。我咆哮他通過gcc6編碼,它編譯。 – MikeMB