template 不能分别在.h和.cpp中定义模板
先上代码:
#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中定义模板的更多相关文章
- C++编译与链接(0)-.h与.cpp中的定义与声明
C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东西可在头文件中定义,声明,哪些东西又必须 ...
- 在.h和.cpp中包含头文件的区别
1.在.h中包含头文件,是为了声明一系列这个头文件的变量等,可能会产生重复包含的问题: 2.在.cpp中包含头文件只是为了实现这个头文件或者使用其中的方法,不会有重复包含的问题,所以尽量在源文件中包含 ...
- 在 .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" 匹配整个 ...
- html中定义模板
定义一个html中不解析的模板,有如下三种方法1.使用<xmp>标签 <xmp id="test"> <div>测试</div> & ...
- MFC 如何在一个类中使用在其他类中定义的变量或函数
[声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ...
- WPF中通过代码定义模板
WPF中可以再XAML中定义模板,也可以通过C#代码定义模板,通过代码可能更清楚的看清其逻辑,而且代码的好处就是可以随时动态的去操作,而在XAML中定义的一般都是静态的. //控件呈现的显示内容1(这 ...
- 解决VS2010子目录中的.cpp文件引用上一级目录的stdafx.h找不到定义的问题
Source目录 |-- stdafx.h |--Util目录 |--Util.h |--Util.cpp 现在的发现Util.cpp各种变量的定义全是红色波浪线,找不到定义,但是却能够编译过 问题就 ...
- c++ *.h和*.cpp在编译中的作用
首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj,obj是什么东西?就是编译单元了. 一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想 ...
- Qt Creator 中,如何更改h,cpp,ui的文件并不让ui失效
这个星期在使用qt,碰到一个很蛋疼的问题:创建对话框的时候,不小心输错了名字.而且是在很迟才发现的.这个时候对话框都已经布局差不多了,为了改名字,碰到更蛋疼的问题,改了名字后就无法使用转到槽的功能了. ...
随机推荐
- android 打包失败
如果在打包时提示: proguard returned with error code 1 并且在控制台中输出:'java'不是内部或外部程序或批处理文件 那么就说明你的环境变量出问题了,之前用的 ...
- 超强、超详细Redis数据库入门教程
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
- J2EE、J2SE、J2ME是什么意思?
本文介绍Java的三大块:J2EE.J2SE和J2ME.J2SE就是Java2的标准版,主要用于桌面应用软件的编程:J2ME主要应用于嵌入是系统开发,如手机和PDA的编程:J2EE是Java2的企业版 ...
- ie7、ie8 下Table 中 td 列固定宽度 未按样式设定显示 曲线解决方案
<!doctype html> <html> <head> <meta charset='utf-8'> <style> .title {b ...
- FB
转眼间,开始工作到现在好几年,忙着功能,忙着补漏填坑,忙着项目,现在回顾着开始的理想,一时有点恍惚,然后鄙视了下自己居然还在“理想”中…… 那就开始吧,做点什么呢? DX9/DX11的支持是必须的,S ...
- ThinkPHP(3)SQL查询语句
ThinkPHP中对查询语句,包含了基本的查询方式.表达方式.快速查询.区间查询.组合查询.SQL查询.动态查询和子查询. 一.查询方式 ThinkPHP提供了三种基本的查询方式:字符串条件查询.索引 ...
- 安全协议系列(三)----CCMP与WPA-PSK
本节讨论 CCM 在 WiFi 中的实际应用 -- CCMP 协议 根据 RFC 3610,完成 CCMP 报文的加解密,需要提供:分组密钥(K).随机数(Nonce).附加认证数据(AAD),这三个 ...
- android开发虚拟机不能正常启动
点击 window---perspective---DDMS---查看设备状态, 如果显示没有可用设备,则在AVD manager中重 启即可, 若列表中有设备,但显示offline 可采用一下方式 ...
- VS2010的项目配置
一直对VS的项目配置都是不怎么了解的,以前用过点,半年不用后,什么都忘记了... 下面这个是免于输入过长的引用头文件的,比如:#include “D:/C++/curl-7.37.0/libcurl/ ...
- H3C汇聚层交换机认证在线人数展示系统之需求说明和功能点说明
一.需求 (一)每五分钟查询一次交换机的连接情况: (二)每2.5分钟更新每栋楼的连接情况. 二.功能点 序号 功能点说明 待定 完成 未完成 完成时间 预计用时(min) 实际用时(min) 备注 ...