作者rebellionyu (Rebellionyu)
看板C_and_CPP
标题[问题] template class编译问题
时间Sun Feb 19 21:38:52 2017
开发平台(Platform): Windows 10
编译器:MinGW G++
额外使用到的函数库(Library Used): No
问题(Question):
我在练习data structure linked list,目前有四个档案,分别是:
SLinkedList.h, SLinkedList.cpp, SNode.h, main.cpp
code在底下。
喂入的资料(Input):
compile command:g++ main.cpp SLinkedList.cpp
预期的正确结果(Expected Output):
正确编译产生a.exe档
错误结果(Wrong Output):
...\AppData\Local\Temp\cceyYWGl.o:main.cpp:(.text+0x16):
undefined reference to `SLinkedList<std::string>::SLinkedList()'
...\AppData\Local\Temp\cceyYWGl.o:main.cpp:(.text+0x26):
undefined reference to `SLinkedList<std::string>::~SLinkedList()'
collect2.exe: error: ld returned 1 exit status
程式码(Code):(请善用置底文网页, 记得排版)
================================
SLinkedList.h
================================
#include "SNode.h"
#ifndef SLINKEDLIST_H
#define SLINKEDLIST_H
template<typename E>
class SLinkedList {
public:
SLinkedList();
~SLinkedList();
bool empty() const;
const E& front() const;
void addFront(const E& e);
void removeFront();
private:
SNode<E>* head;
};
#endif
================================
SLinkedList.cpp
================================
#include "SLinkedList.h"
#include <stddef.h>
template<typename E>
SLinkedList<E>::SLinkedList()
: head(NULL) { }
template<typename E>
SLinkedList<E>::~SLinkedList() {
while (!empty()) removeFront();
}
template<typename E>
bool SLinkedList<E>::empty() const {
return head == NULL;
}
template<typename E>
const E& SLinkedList<E>::front() const {
return head->elem;
}
template<typename E>
void SLinkedList<E>::addFront(const E& e) {
SNode<E>* v = new SNode<E>;
v->elem = e;
v->next = head;
head = v;
}
template<typename E>
void SLinkedList<E>::removeFront() {
SNode<E>* old = head;
head = old->next;
delete old;
}
================================
SNode.h
================================
#ifndef SNODE_H
#define SNODE_H
template<typename E>
class SLinkedlist;
template <typename E>
class SNode {
private:
E elem;
SNode<E>* next;
friend class SLinkedlist<E>;
};
#endif
================================
main.cpp
================================
#include "SLinkedList.h"
#include <iostream>
using namespace std;
int main() {
SLinkedList<string> b;
return 0;
}
补充说明(Supplement):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.48.28
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1487511534.A.826.html
1F:→ ilikekotomi: 看一下本版的#1Nu-yT4R 应该是一样的问题 02/19 21:45
2F:推 Sirctal: 我记得没错tempalte尽量不要拆 h跟cpp 虽然说还是可以拆 02/19 21:46
3F:→ Sirctal: 但是有些小技巧 02/19 21:46
4F:→ rebellionyu: 好,谢谢,我来试试 02/19 21:56