一个链接错误

错误

对于数据结构,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)中

猜你喜欢

转载自blog.csdn.net/lituusliu/article/details/79090527