模板链接列表编译错误

时间:2014-10-06 20:03:24

标签: c++ class templates

我正在为学校制定计划。这是一个使用模板的链接列表。

我有一个抽象的基类:

#pragma once
#include <string>

using namespace std;

template<class T>
class LinkedListInterface
{

public:

    LinkedListInterface(void){};
    virtual ~LinkedListInterface(void){};


    virtual void insertHead(T value) = 0;


    virtual void insertTail(T value) = 0;


    virtual void insertAfter(T value, T insertionNode) = 0;


    virtual void remove(T value) = 0;


    virtual void clear() = 0;


    virtual T at(int index) = 0;


    virtual int size() = 0;

};

我从中衍生出来的课程:

/* Linklist.h
 *
 *  Created on: Oct 4, 2014
  *   
  */

 #ifndef LINKLIST_H_
 #define LINKLIST_H_

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

 template<class T>
 class Linklist: public LinkedListInterface<T> {
 private:
     struct _node
         {
           T val;
           Linklist *next;
         };
         struct _node node ;
        Linklist *root = NULL;
        Linklist *tail = NULL;
        int _size = 0;
        int finddup(T value);
 public:
    Linklist();
    virtual ~Linklist();


     void insertHead(T value);
      void insertTail(T value);


         void insertAfter(T value, T insertionNode);


         void remove(T value);


         void clear();


         T at(int index);


         int size();

 };

 #endif /* LINKLIST_H_ */

Linklist.cpp

 /*
  * Linklist.cpp
  *
  *  Created on: Oct 4, 2014
  *      
  */

 #include "Linklist.h"

 template<class T>
 Linklist<T>::Linklist()
 {
    // TODO Auto-generated constructor stub

 }

 template<class T>
 Linklist<T>::~Linklist()
 {
    // TODO Auto-generated destructor stub
 }

 template<class T>
 int Linklist<T>::finddup(T value)
 {
    Linklist *tmp = root;

    while (tmp)
    {
        if (tmp->node.val == value)
        {
            return 1;
        }
    }

    return 0;
 }


 template<class T>
 void Linklist<T>::insertHead(T value)
 {
    Linklist *tmp = root;

    if (finddup(value))
    {
        return;
    }
    else
    {
        if (!root)
        {
            root = new Linklist<T>();
            root->val = value;
            root->next = NULL;
            tail = root;
            _size++;
        }
        else
        {
            Linklist *newr = new Linklist<T>();
            newr->node.val = value;
            newr->node.next = root;
            root = &newr;
            _size++;
        }
    }

 }


 template<class T>
 void Linklist<T>::insertTail(T value)
 {
    Linklist *tmp = root;

    if (finddup(value))
    {
        return;
    }
    else
    {
        if (!tail)
        {
            tail = new Linklist<T>();
            tail->val = value;
            tail->next = NULL;
            root = tail;
            _size++;
        }
        else
        {
            Linklist *newr = new Linklist<T>();
            newr->node.val = value;
            newr->node.next = NULL;
            tail->node.next = &newr;
            tail = &newr;
            _size++;
        }
    }

 }


 template<class T>
 void Linklist<T>::insertAfter(T value, T insertionNode)
 {

    if (finddup(value))
    {
        return;
    }
    else
    {
        Linklist *tmp = root;
        while (tmp)
        {
            if (tmp->node.val == insertionNode)
            {
                Linklist *newr = new Linklist<T>();
                newr->node.val = value;
                 newr->node.next = tmp->node.next;
                 tmp->node.next = &newr;
                 _size++;
                 break;
             }
             else
                 tmp = tmp->node.next;
         }
     }
 }


 template<class T>
 void Linklist<T>::remove(T value)
 {
    Linklist *prev = NULL, *active = NULL;

    if (!root)
        std::cout << "List is empty" << std::endl;
    else
    {
         if (root && root->node.val == value)
         {
             Linklist *t = root;
             root = t->node.next;
             delete t;
             _size--;
         }
     }
     prev = root;
     active = root->node.next;
     while (active)
     {
         if (active->node.val == value)
         {
             prev->node.next = active->node.next;
             delete active;
             _size--;
             active = prev->node.next;
         }
         else
        {
            prev = active;
             active = active->node.next;
         }
     }

 }


 template<class T>
 void Linklist<T>::clear()
 {
     Linklist *t = root;
     while (t)
     {
         t = root->node.next;
         delete root;
         root = t;
     }
     root = NULL;
     tail = NULL;
     _size = 0;

 }


 template<class T>
 T Linklist<T>::at(int index)
 {
    Linklist *t = root;

     if (index < _size)
     {
         for (int i = 0; i < _size; i++)
         {
             t = t->node.next;
         }
     }
     else
     {
         t = NULL;
     }

     return (t);

 }


 template<class T>
 int Linklist<T>::size()
 {
     return (_size);
 }

那些似乎没问题。问题是当我尝试在提供并修改的工厂类中创建Linklist对象时。

 #include "Factory.h"

 #include "Linklist.h"



 //You may add #include statements here

 /*

     You will MODIFY THIS DOCUMENT.

 */

 /*

     getLinkedListInt() and

     Creates and returns an object whose class extends LinkedListInterface.

     This should be an object of a class you have created.

     Example: If you made a class called "LinkedList", you might say, "return new      LinkedList<int>();".

 */

 LinkedListInterface<int> * Factory::getLinkedListInt()
 {

     return new Linklist<int>();

 }



 /*
     getLinkedListString() and

     Creates and returns an object whose class extends LinkedListInterface.

     This should be an object of a class you have created.

     Example: If you made a class called "LinkedList", you might say, "return new LinkedList<string>();".

 */

 LinkedListInterface<string>* Factory::getLinkedListString()
 {

     return new Linklist<string>();

 }

我被告知:

 undefined reference to `Linklist<int>::Linklist()'

 undefined reference to `Linklist<string>::Linklist()'

编译时我不太了解模板,不知道我搞砸了什么。

有人有任何建议吗?

由于

1 个答案:

答案 0 :(得分:0)

开始工作:

的main.cpp

#include "Source.h"

int main() {
    Linklist<int> obj;
}

Source.h

#pragma once

template <class T>
class Linklist {
public:
    Linklist();
};

Source.cpp

#include "Source.h"

template <class T>
Linklist<T>::Linklist() {}

输出:

  

错误LNK2019:未解析的外部符号“public:__ cdecl Linklist :: Linklist(void)”

这是因为模板的实例化方式。

在您的特定情况下,您可以显式实例化intstring类型,也可以更改设计,以便在头文件中包含声明和定义。

了解更多信息:Why can templates only be implemented in the header file?