错误LNK2019无法解析的外部符号“ public:__thiscall SLinkList <char> :: SLinkList <char>(void)”

时间:2018-08-26 16:08:25

标签: c++ templates

我不知道为什么:当声明和定义未与块的类(类SLinkedList {....})分开时。建设将会成功。

但是当我分开下面的类的声明和定义时。建筑物将报告这样的错误

  

"Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol "public: __thiscall SLinkList<char>::SLinkList<char>(void)" (??0?$SLinkList@D@@QAE@XZ) referenced in function _main LinkedLists C:\Users\LQA\Documents\Visual Studio 2015\Projects\DataStructures\DataStructures\Source.obj 1"

这是详细的源代码: [LinkedLists.h]

#include <iostream>
#include <string>
using namespace std;


//Singly Linked List

template<typename E>
class SLinkList;

template<typename E>
class SNode
{
private:
    E elem;
    SNode<E>* next;
    friend class SLinkList<E>;
};

template<typename E>
class SLinkList
{
public:
    SLinkList();
    ~SLinkList();
    bool empty() const;
    const E& front() const;
    void addFront(const E& e);
    void removeFront();
private:
    SNode<E>* head;
};

[LinkedLists.cpp]

#include "LinkedLists.h"


/*
 * SINGLY LINKED LIST
 */
template<typename E>
SLinkList<E>::SLinkList() :
    head(NULL) {}

template<typename E>
SLinkList<E>::~SLinkList()
{
    while (!this->empty())
    {
        removeFront();
    }
}

template<typename E>
bool SLinkList<E>::empty() const
{
    return head == NULL;
}

template<typename E>
const E& SLinkList<E>::front() const
{
    return this->head->elem;
}

template<typename E>
void SLinkList<E>::removeFront()
{
    SNode<E>* old = this->head;
    this->head = old->next;
    delete old;
}

template<typename E>
void SLinkList<E>::addFront(const E& e)
{
    SNode<E>* v = new SNode<E>;
    v->elem = e;
    v->next = this->head;
    this->head = v;
}

[Source.cpp]

#include "LinkedLists.h"
using namespace std;

int main(void)
{
    SLinkList<char>* llst = new SLinkList<char>();
    //llst->addFront('a');
    //llst->addFront('b');
    return 0;
}

有人知道造成此问题的原因吗?

2 个答案:

答案 0 :(得分:0)

您是否尝试在h文件的类声明之前添加“ __declspec(dllexport)”?

将类函数成员定义移动到单独的cpp文件后,您需要添加此说明符,以使所有定义在dll外部可见。

答案 1 :(得分:0)

如果您在c ++中声明模板类,则应在标头文件中包含函数主体。

例如:[LinkedLists.h]

...
template<typename E>
class SLinkList
{
public:
    SLinkList() : head(NULL) {};
    ~SLinkList() 
    {
        while (!this->empty())
        {
            removeFront();
        }
    };

    bool empty() const
    {
        return head == NULL;
    }
...