2016-12-27 10 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

um, если я хочу это сделать, что мне делать? – wind2412

+0

Создайте макрос клавиатуры для 'RBTree :: TreeNode :: NIL'. Обратите внимание, что это необходимо только за пределами области шаблонов. Внутри шаблона «TreeNode :: NIL» будет достаточно или просто «NIL» внутри области «TreeNode». Возможно, несколько «typedef RBTree :: TreeNode», кое-где, уменьшат боль. –

ответ

1

using используется для создания псевдонима для типа. Вы хотите создать псевдоним для переменной, которая в C++ является ссылкой . Благодаря переменным шаблона 14 C++ в следующий должно работать:

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

Btw .: Я не думаю, что в своем классе инициализации NIL будет работать, как вы показали в вашем примере, как это не является constexpr. Вероятно, вам придется определить и инициализировать его вне класса.

Edit:

Если вы застряли в 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

поблагодарить u все равно! ~ – wind2412

+0

@ wind2412: Пожалуйста, разместите точный код, создающий эту проблему. Я передал ему код через gcc6, и он скомпилировался. – MikeMB

 Смежные вопросы

  • Нет связанных вопросов^_^