2015-07-01 3 views
0

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

В моем основном я вызываю List<int> list1;, чтобы создать экземпляр класса List. Список содержит несколько элементов списка, которые содержат значение, которое должно быть шаблоном.

Компилятор выдает ошибку при

ListElement* first; 
ListElement* last; 

в List.h. Это говорит C2955 - 'ListElement': использование типа класса требует список типов аргумента

list.h

#pragma once 
#include <string> 
#include "ListElement.h" 
template<class T> 
class List 
{ 
private: 
    ListElement* first; 
    ListElement* last; 
public: 
    List(); 
    ~List(); 
    void printList(); 
    void pushBack(T value); 
    void pushFront(T value); 
}; 

List.cpp

#include <iostream> 
#include "List.h" 

template<class T> 
List<T>::List() 
{ 
    first = NULL; 
    last = NULL; 
} 

template<class T> 
List<T>::~List() 
{ 
} 

template<class T> 
void List<T>::pushBack(T value) 
{ 
    if (last) 
    { 
     ListElement* tmp = last; 
     last = new ListElement(value); 
     last->setPrev(tmp); 
     tmp->setNext(last); 
    } 
    else 
    { 
     first = new ListElement(value); 
     last = first; 
    } 
} 

template<class T> 
void List<T>::pushFront(T value) 
{ 
    if (first) 
    { 
     ListElement* tmp = first; 
     first = new ListElement(value); 
     first->setNext(tmp); 
     tmp->setPrev(first); 
    } 
    else 
    { 
     last = new ListElement(value); 
     first = last; 
    } 
} 

template<class T> 
void List<T>::printList() 
{ 
    if (first) 
    { 
     ListElement* tmp = first; 
     while (tmp) 
     { 
      std::cout << tmp->getValue() << std::endl; 
      if (tmp != last) 
       tmp = tmp->getNext(); 
      else 
       break; 
     } 
    } 
    else 
    { 
     std::cout << "List is empty!" << std::endl; 
    } 
} 

template class List<int>; 
template class List<std::string>; 

ListElement.h

#pragma once 
#include <string> 
template<class T> 
class ListElement 
{ 
private: 
    ListElement* next; 
    ListElement* prev; 
    T value; 
public: 
    ListElement(T val); 
    ~ListElement(); 
    ListElement* getNext() { return next; } 
    ListElement* getPrev() { return prev; } 
    void setNext(ListElement* elem) { next = elem; } 
    void setPrev(ListElement* elem) { prev = elem; } 
    T getValue() { return value; } 
}; 

ListElement.cpp

#include "ListElement.h" 

template<class T> 
ListElement<T>::ListElement(T val) 
{ 
    value = val; 
} 

template<class T> 
ListElement<T>::~ListElement() 
{ 
} 

template class ListElement<int>; 
template class ListElement<std::string>; 

ответ

2

ListElement шаблон, так что вы хотите использовать определенное инстанцирование для указателей:

template<class T> 
class List 
{ 
private: 
    ListElement<T>* first; 
    ListElement<T>* last; 
    // note: ^^^ 

также для других случаев. Только в шаблоне имя шаблона можно использовать для текущего экземпляра, т. Е. в пределахList, вы можете использовать List в качестве ярлыка для List<T>.