我不知道为什么:当声明和定义未与块的类(类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;
}
有人知道造成此问题的原因吗?
答案 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;
}
...