Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板链接列表编译错误_C++_Class_Templates - Fatal编程技术网

C++ 模板链接列表编译错误

C++ 模板链接列表编译错误,c++,class,templates,C++,Class,Templates,我正在为学校做一个项目。这是一个使用模板的链接列表 我有一个抽象基类: #pragma once #include <string> using namespace std; template<class T> class LinkedListInterface { public: LinkedListInterface(void){}; virtual ~LinkedListInterface(void){}; virtual voi

我正在为学校做一个项目。这是一个使用模板的链接列表

我有一个抽象基类:

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

};
从中派生出一个I类:

/* 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);
 }
那些似乎没问题。问题是当我试图在提供并修改的factory类中创建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()'
当我编译的时候。我对模板的理解不够透彻,不知道我搞砸了什么

有人有什么建议吗

谢谢

这是行不通的:

main.cpp

#include "Source.h"

int main() {
    Linklist<int> obj;
}
来源:h

#pragma once

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

#include "Source.h"

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

错误LNK2019:未解析的外部符号公共:\ uu cdecl链接列表::Linklistvoid

这是因为模板是如何实例化的

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

有关更多信息: