错误
对于数据结构,c++优于C的一点是它可以使用模版(template). 为了体会c++的这一特点, 我计划在短时间内把链表的代码敲一遍, 然而在编译时出现了一长串莫名其妙的链接错误:
//g++编译
main.cpp:(.text+0x61): undefined reference to LinkListClass::LinkListClass()’//cl 编译
main.obj : error LNK2001: unresolved external symbol “public: __thiscall LinkListClass::LinkListClass(void)”
三个文件如下
代码:
//main.cpp
#include <iostream>
#include "LinkListClass.h"
using namespace std;
int main()
{
int arr[]={1,3,34,56,12,54,5,7,8,23};
LinkListClass<int> L2;//decltype(arr[0]+0)
L2.CreatListR(arr, 10);
L2.DisplayList();
cout<<endl;
return 0;
}
//LinkListClass.h
#ifndef LINKLISTCLASS_H
#define LINKLISTCLASS_H
template<typename T>
struct LinkList
{
T data;
LinkList<T> *next;
};
template<typename T>
class LinkListClass
{
private:
LinkList<T> *head;
public:
LinkListClass();
~LinkListClass();
/*
...
*/
};
#endif
//LinkListClass.cpp
#include "LinkListClass.h"
#include <iostream>
template<typename T>
LinkListClass<T>::LinkListClass()
{...}
template<typename T>
LinkListClass<T>::~LinkListClass()
{...}
抓狂
盲目google+baidu几个小时依然无解。但我确定代码没错(因为代码全放在main.cpp则正常!), 而链接出错的原因, 以我目前的知识范围,只有文件包含出问题这一种情况。但在卸载之前的VS2015上,我就是这么个写代码的习惯, 也没链接出错的经历。
转念一想, 不是undefined吗, IDE识别不了我就把cpp文件也include到main()函数中(虽然从没见过这么诡异的做法), 结果居然链接成功!
结论
此例告诉我们, template类的实现要和声明写在一个文件(xxx.h)中!