2017-01-21 11 views
2

Я реализует этот класс:C++ - Внедрение методов шаблонных внутреннего шаблона класса в отдельном файле

#ifndef LIST_H 
#define LIST_H 

template <typename ListType> class List{ 
public: 

    enum ListPosition{LIST_START=-2,LIST_END=-1}; 
    enum Order{ASCENDANT,DESCENDANT}; 

    template <typename NodeType> class ListNode{ 

     public: 

      ListNode(const NodeType &value,const ListNode<NodeType>*const pElement, const ListNode<NodeType>*const nElement); 
      ~ListNode(); 

      ListNode<NodeType> *const previous() const; 
      ListNode<NodeType> *const next() const; 

      void setPrevious(const ListNode<NodeType> *const pElement); 
      void setNext(const ListNode<NodeType> *const nElement); 
      void setValue(const NodeType& value); 

     private: 

      ListNode<NodeType> *pElement; 
      ListNode<NodeType> *nElement; 
      NodeType *value; 
    }; 

    List(); 
    List(const List<ListType> &list); 
    ~List(); 

    bool contains(const ListType& value) const; 

    ListType& get(const int pos) const; 
    ListNode<ListType>& getNode(const int pos) const; 

    void add(const ListType& value); 
    void add(const int pos, const ListType& value); 
    void addAll(const int pos, const List<ListType>& list); 
    void set(const int pos, const ListType& value); 
    void remove(const int pos); 
    void remove(const ListType& value); 

    void order(Order order); 

    int size() const; 

    bool operator==(const List<ListType>& list) const; 
    void operator=(const List<ListType>& list); 
    operator const char *() const; 
    ListType& operator[](const int pos) const; 
    const ListNode<ListType>& operator[](const ListType& value) const; 

protected: 

    ListNode<ListType> *firstNode; 
    ListNode<ListType> *lastNode; 

    int _size; 
}; 

#include "ListCode.h" 
#include "ListNodeCode.h" 
#endif 

Я хочу реализовать ListNode класс в ListNodeCode.h, но я получаю эту ошибку:

[Error] specializing member 'List::ListNode::ListNode' requires 'template<>' syntax

И это единственный способ, на данный момент, в ListNodeCode.h:

#ifndef LISTNODECODE_H 
#define LISTNODECODE_H 
template <typename NodeType> List<NodeType>::ListNode<NodeType>::ListNode(const NodeType& value,const ListNode<NodeType>*const pElement, const ListNode<NodeType>*const nElement){ 

this->value=new NodeType(); 
*(this->value)=value; 

this->pElement=pElement; 
this->nElement=nElement; 

cout << "Node created, (Value: " << (*this->value) << ", previous: " << pElement << ", next: " << nElement; 
} 

#endif 

Как я могу его правильно реализовать?

ответ

3

Отметьте, что ListNode является member template; и там уже два отдельных параметров шаблона, один (т.е. ListType) для шаблона ограждающей List, один (т.е. NodeType) для шаблона члена ListNode, поэтому определение должно быть:

template <typename ListType> // for the enclosing class template 
template <typename NodeType> // for the member template 
List<ListType>::ListNode<NodeType>::ListNode(const NodeType& value,const ListNode<NodeType>*const pElement, const ListNode<NodeType>*const nElement) { 
    // ... 
} 
+0

Спасибо, это сработало! Но есть ли способ заставить один и тот же параметр шаблона работать с обоими классами? Если да, это было бы полезно, так как мне не пришлось бы использовать параметр шаблона «NodeType» –

+0

@FrancescoRizzi. Вы имеете в виду, что 'ListNode' всегда будет использовать тот же аргумент шаблона' List'? Тогда почему бы не сделать это классом без шаблонов? – songyuanyao

+0

Будет ли «значение» и другие атрибуты правильного типа? (ListType вместо NodeType) –

1

Это вложенная шаблон, поэтому вы должны использовать оба уровня в определении, а также

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

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