先上代码:

 #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. idea 中利用maven创建java web 项目

    转自:http://www.linuxidc.com/Linux/2014-04/99687.htm 本文主要使用图解介绍了使用IntelliJ IDEA 12创建Maven管理的Java Web项目 ...

  2. HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)

    工作中遇到的问题,上网看到别人整理的,我就记下来,嘻嘻!!! 宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 ...

  3. 不懂指针就不要说自己学过C语言!

    不懂指针就不要说自己学过C语言! 1.掌握了指针,就掌握了C语言的精髓!计算机中绝大部分数据都放到内存中的,不同的数据放到不同的内存区域中. 内存角度没有数据类型,只有二进制:数据以字节(8位二进制) ...

  4. patchca验证码的使用

    /** * 生成验证码 */ private static RandomFontFactory ff = null; // 自定义验证码图片背景 private static MyCustomBack ...

  5. 安全协议系列(五)---- IKE 与 IPSec(中)

    在上一篇中,搭建好了实验环境.完整运行一次 IKE/IPSec 协议,收集相关的输出及抓包,就可以进行协议分析.分析过程中,我们将使用 IKE 进程的屏幕输出和 Wireshark 抓包,结合相关 R ...

  6. qt做触摸屏演示程序

    界面效果图: 参考资料: http://blog.csdn.net/orz415678659/article/details/9136575     这个最重要.. https://www.oschi ...

  7. C语言程序设计第九次作业

    一.学习内容      本次课我们重点学习了怎样向函数传递数组,鉴于大家对函数和数组的理解和运用还存在一些问题,下面通过一些实例加以说明,希望同学们能够认真阅读和理解.      例1:火柴棍拼数字 ...

  8. linux清理内存

    free -m echo 1 > /proc/sys/vm/drop_caches

  9. 结构及其使用 struct (C#)

    首先结构是值类型. 结构是使用 struct 关键字定义的,结构如下: struct 结构名{} 结构概述 结构具有以下特点: 结构是值类型,而类是引用类型. (结构不能包含显式的无参数构造函数) 与 ...

  10. maven 配置

    四.eclipse配置maven eclipse---window---maven------User Settings: 之前设置的仓库的位置: 五.idea15配置maven idea14---s ...