指向模板类对象的指针

时间:2015-07-01 19:59:21

标签: c++ templates

我尝试使用模板化值创建单个列表,但遗憾的是我无法使用模板从列表链接到ListElements。

在我的主要内容中,我调用List<int> list1;来创建类List的实例。 List包含多个ListElements,其中包含应该模板化的值。

编译器在

处抛出错误
ListElement* first;
ListElement* last;
List.h中的

它说C2955 - &#39; ListElement&#39; :使用类类型需要类型参数列表

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

1 个答案:

答案 0 :(得分:2)

ListElement是一个模板,因此您希望为指针使用特定的实例化:

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

同样适用于其他事件。仅在模板中,模板名称可用于当前实例化,即 List内的,您可以使用List作为List<T>的快捷方式。< / p>