先上代码:

 #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. Github——入门笔记

    一般操作步骤 developer:(你在别人基础上开发) init->clone->add->commit->remote add(origin的地址)->push or ...

  2. RoseRT配置高版本的编译器

    RoseRT配置高版本的VC++ ,我有VC++2008 Express ,实习时下载滴! 感谢Google,感谢大神地指导!困扰的问题终于解决,豁然开朗,so开始吧! 第一大步:重中之重, 确保nm ...

  3. selenium+python+eclipse开发中遇到的问题

    1.中文编码问题 报错提示:SyntaxError: Non-ASCII character '\xba' in file D:\autotest\PythonCase\src\selenium\te ...

  4. Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误

    在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...

  5. 自定义javascript log方法

    /** * 类似chrome,firefox的console对象 * 但是在IE等不支持console的浏览器不会报错 * 理论上浏览器支持的console的方法都支持,比如谷歌的 * assert, ...

  6. git基本技巧及进阶

    基本技巧 1. 安装后的第一步 在安装好git后,你第一件该做的事是设置你的名字和电子邮箱,因为每次提交都要用到这些信息: $ git config --global user.name " ...

  7. QM UML状态机建模实例之Blinky for cortex-m0

    简介:QP由Quantum Leaps公司开发异于传统顺序式系统(前后台架构即main+ISR)和传统多任务系统(操作系统)的事件驱动型状态机框架,实现了在C语言下的面向对象编程,该框架支持有限状态机 ...

  8. jpa 表字段转bean对象

    select 'private ' || decode(v_type, 'int', 'Integer', 'float', 'Double', 'date', 'Date', 'String') | ...

  9. ios控制器生命周期详解

    #import "MyOneViewController.h" @interface MyOneViewController () @property (nonatomic, st ...

  10. C语言状态机模板

    转载声明:如果转载本博客内容,请联系869119842@qq.com,获得作者书面授权. 前言 上一篇我的博客中探讨了一种非swtich-case结构的状态机写法,但是个人感觉写起来比较麻烦,如果增加 ...