先上代码:

 #ifndef SEQLIST_H
#define SEQLIST_H #include <iostream> const int MaxLength = ; template <typename type>
class SeqList
{
public:
SeqList();
~SeqList();
int getLength() const;
type getElement(int i) const;
int locate(type &item) const;
int insert(const type item,int i);
type deleteElement(const int i);
bool isEmpty() const;
void clear();
int append(type item);
private:
type data;
int length;
}; #endif // SEQLIST_H

以上是数据结构中定义的顺序线性表的头文件,接下来的是类的实现过程,我是直接用的Qt做的,比较省事嘛。

 #include "seqlist.h"

 using namespace  std;

 //构造函数
template <typename type> SeqList<type>::SeqList():length()
{
data = new type[MaxLength];
} //析构函数
template <typename type> SeqList<type>::~SeqList()
{
delete []data;
return length;
} //得到链表当前长度
template <typename type> int SeqList<type>::getLength() const
{
return length;
} //根据索引得到相应元素
template <typename type> type SeqList<type>::getElement(int i) const
{
if(i>=&&i<length)
return data[i];
return NULL;
} //根据元素得到索引位置
template <typename type> int SeqList<type>::locate(type &item) const
{
for(int i = ;i<length;i++)
{
if(data[i]==item)
return i;
else
{
break;
}
}
} //在第i个元素之前插入元素item
template <typename type> int SeqList<type>::insert(const type item, int i)
{
if(length == MaxLength)
return ;
if(i<||i>length)
return ;
for(int j = length;j>i;j--)
{
data[j]= data[j-];
}
data[i] = item;
length++;
return ;
} //删除第i个元素
template <typename type> type SeqList<type>::deleteElement(const int i)
{
if(length == )
return ;
if(i<||i>length)
return ;
type t = data[i];
for(int j = i;j<length;j++)
{
data[j] = data[j+];
}
length --;
return t;
} //查询链表是否为空
template <typename type> bool SeqList<type>::isEmpty() const
{
if(length == )
{
return true;
}
return false;
} //清空链表
template <typename type> void SeqList<type>::clear()
{
length =;
} //添加一个元素
template <typename type>int SeqList<type>::append(type item)
{
if(length == MaxLength)
return ;
data[length] = item;
return ;
}

代码中如果存在错误,就是我才学数据结构,自己在实验室做练习时写错了。毕竟才学。

然后是main.cpp

 #include "seqlist.h"
#include <iostream> using namespace std; int main()
{
SeqList<int> *list = new SeqList<int>;
for(int i = ;i<;i++)
{
list->insert(i,i);
} for(int i = ;i<;i++)
{
list->getElement(i);
}
list->append();
return ;
}

然后事情就发生了,我使用Qt已经有一段时间了,对Qt来说不说炉火纯青,但也了解不少了,怎么出现这种情况了呢?

error: LNK2019: 无法解析的外部符号 "public: int __thiscall SeqList<int>::append(int)" (?append@?$SeqList@H@@QAEHH@Z),该符号在函数 _main 中被引用

error: LNK2019: 无法解析的外部符号 "public: __thiscall SeqList<int>::SeqList<int>(void)" (??0?$SeqList@H@@QAE@XZ),该符号在函数 _main 中被引用

赚到VS上还是不行,想了会想起来应该是类中定义的方法未实现,于是把.cpp中的方法全部复制到了.h中,删掉.cpp。OK了

原来template 定义模板是不能分别在.h和.cpp中写的。

template 不能分别在.h和.cpp中定义模板的更多相关文章

  1. C++编译与链接(0)-.h与.cpp中的定义与声明

    C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东西可在头文件中定义,声明,哪些东西又必须 ...

  2. 在.h和.cpp中包含头文件的区别

    1.在.h中包含头文件,是为了声明一系列这个头文件的变量等,可能会产生重复包含的问题: 2.在.cpp中包含头文件只是为了实现这个头文件或者使用其中的方法,不会有重复包含的问题,所以尽量在源文件中包含 ...

  3. 在 .h 和 cpp 中查找 :grep consume ~/test/2016/AMQP-CPP/**/*.cpp ~/test/2016/AMQP-CPP/**/*.h -r

    :grep consume ~/test/2016/AMQP-CPP/**/*.cpp ~/test/2016/AMQP-CPP/**/*.h -r -w "whole" 匹配整个 ...

  4. html中定义模板

    定义一个html中不解析的模板,有如下三种方法1.使用<xmp>标签 <xmp id="test"> <div>测试</div> & ...

  5. MFC 如何在一个类中使用在其他类中定义的变量或函数

    [声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ...

  6. WPF中通过代码定义模板

    WPF中可以再XAML中定义模板,也可以通过C#代码定义模板,通过代码可能更清楚的看清其逻辑,而且代码的好处就是可以随时动态的去操作,而在XAML中定义的一般都是静态的. //控件呈现的显示内容1(这 ...

  7. 解决VS2010子目录中的.cpp文件引用上一级目录的stdafx.h找不到定义的问题

    Source目录 |-- stdafx.h |--Util目录 |--Util.h |--Util.cpp 现在的发现Util.cpp各种变量的定义全是红色波浪线,找不到定义,但是却能够编译过 问题就 ...

  8. c++ *.h和*.cpp在编译中的作用

    首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj,obj是什么东西?就是编译单元了. 一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想 ...

  9. Qt Creator 中,如何更改h,cpp,ui的文件并不让ui失效

    这个星期在使用qt,碰到一个很蛋疼的问题:创建对话框的时候,不小心输错了名字.而且是在很迟才发现的.这个时候对话框都已经布局差不多了,为了改名字,碰到更蛋疼的问题,改了名字后就无法使用转到槽的功能了. ...

随机推荐

  1. 面试复习(C++)之归并排序

    #include <iostream> #include<stdlib.h>//引入malloc using namespace std; void Merge(int *a, ...

  2. 面试复习(C++)之冒泡排序

    第一次写技术博客,先只贴代码吧. #include <iostream> using namespace std; void Bubble(int *arr,int len) { int ...

  3. powershell字符界面的,powershell加WPF界面的,2048游戏

    ------[序言]------ 1 2048游戏,有段时间很火,我在地铁上看有人玩过.没错,坐地铁很无聊,人家玩我就一直盯着看. 2 我在电脑上找了一个,试玩了以下,没几次格子就满了.我就气呼呼的放 ...

  4. JS 4 新特性:混合属性(mixins)之二

    Mixins many classes[混合许多个类] 迄今为止,我们已经学会了简单的继承,我们还能够通过使用mixins处理机制来混合许多类.源于这种理念是非常简单的:我们能够把许多个类最终混合到一 ...

  5. marquee 实现首尾相连循环滚动效果

    <marquee></marquee>可以实现多种滚动效果,无需js控制.使用marquee标签不仅可以滚动文字,也可以滚动图片,表格等  marquee标签不是HTML3.2 ...

  6. Linux安装FTP服务

    转自:http://blog.csdn.net/huangbiao86/article/details/6641952 ftp服务器 1.  在Linux和其他机器之间共享文件(在linux下安装ft ...

  7. 第一章 Android系统移植与驱动开发概述

    本书第一章首先简单概要地介绍了关于Android系统移植和驱动开发的相关内容. 所谓“移植”是指为特定的自己的设备,如手机定制Android的过程.自己开发一些程序(移植)装载在设备上,使得Andro ...

  8. NLog的使用

    1.项目添加NLog的项目引用: 2.将工程的framework框架改为3.5或4.0,将配置文件[NLog.config]拷贝至运行的bin/(release/debug)路径下 3.项目中代码使用 ...

  9. 关于css的新思考

    因为被派去协助别的组,有机会写了一下react,发现ICE做的那一个套件用来搭建后台系统真的太给力了(插一句必入table组件其实是可以把删除添加座位基础方法加进去的).因为看了demo的代码以及对于 ...

  10. JS总结 本地对象1

    Data对象 用于获取当前时间的对象 例如,要用该对象输出:  2016年9月7日 10:57 星期三   这样格式的时间 var time=new Date(), month=time.getMon ...