2015-08-07 2 views
0

Я пытаюсь использовать шаблоны для вложенного класса. Я не уверен, как получить доступ к типу класса внутреннего класса из другого класса.Как использовать шаблоны с вложенным классом в C++

Пример кода ниже.

// I have a List class that can accept any type. It has an inner class 
template <class T> 
class List 
{ 
    public: 
     class Node 
     { 
      public: 
       T  data; 
       Node* next; 
       Node* prev; 
     }; 

     void addElement(Node& value); 

    private: 
     Node* head; 
}; 

// Here I am making an array of Lists 
template <class T> 
class ListArray 
{ 
    public: 
     // Here is my question. 
     void add(Node& value); // How to give "Node" class type here ? 

    private: 
     List<T> _listArr[10]; 
}; 

// Is the below the right way to define ListArray::add, especially the way in which Node type can be passed to it ? 
template <class T> 
void ListArray<T>::add(List<T>::Node& value) 
{ 
    // Make a call to List::addElement and pass Node& value 
    _listArr[0].addElement(value); 
    //.... 
} 

Не могли бы вы любезно сообщить мне, как это может быть достигнуто? Благодарю.

+0

Что-то вроде 'ListArray :: Node * myNode;'? –

ответ

1

Node вложенная тип шаблона класса:

template <class T> 
class ListArray 
{ 
    public: 
     typedef typename List<T>::Node Node_type; 

     void add(Node_type& value); // Refer to it as Node_type 

    private: 
     List<T> _listArr[10]; 
}; 

И:

template <class T> 
void ListArray<T>::add(typename ListArray<T>::Node_type& value) 
{ 
    _listArr[0].addElement(value); 
    //.... 
} 

Я использовал typedef определить локальное имя для типа узла. Это очень полезно - теперь клиенты ListArray могут писать код, который явно использует Node_type (не зная, что это на самом деле). Этот метод используется в библиотеке std - обычно std:: типов тонн typedefs, позволяющих писать гибкий код.

Также обратите внимание на typename keyword - это необходимо в случае вложенных типов шаблонов классов. Он указывает, что данное имя является именем типа (без него вы должны получить ошибку компилятора).

+0

Спасибо за ключевое слово typename. – SyncMaster