C++ 模板

模版收尾

模版的声明和定义不能分离,否则会报错.

写下面三个文件:

cpp 复制代码
Stack.h

#pragma once
#include<iostream>
using namespace std;
template <class T>
T Add(const T& left, const T& right);
cpp 复制代码
Stack.cpp

#include"Stack.h"
template <class T>
T Add(const T& left, const T& right)
{
	cout << 1 << endl;
	return left + right;

}
cpp 复制代码
Test.cpp



#include"Stack.h"
int main()
{
	Add(1,2);
	fun();
	return 0;
}

运行结果:

如上图所示,模版的声明和定义分离会出现链接错误。

如果我们正常函数的定义和分离就不会出错,比如下图fun函数:

这是刚开始我们把代码加载进内存,运行之后先执行预处理,预处理把"Stack.h"展开。

展开之后就会在Stack.cpp里面找,但是Stack.cpp里面并没有对模版进行实例化,也就找不到地址:

为什么Add预处理阶段找不到地址呢?这是因为在Stack.cpp也就是定义里面Add没有被实例化:

Add是模版,没有实例化,在预编译阶段找不到地址,但是fun我们一开始就定义了是void类型,所以不管是预处理,编译,链接阶段都可以找到它的地址。

解决方案:

1.显示实例化:

缺点:换类型之后还要重新显示实例化,假设我此时这样写:

cpp 复制代码
Add(1.0, 2.0);

就会报错:

cpp 复制代码
1>Test.obj : error LNK2019: 无法解析的外部符号 "double __cdecl Add<double>(double const &,double const &)" (??$Add@N@@YANABN0@Z),函数 _main 中引用了该符号

需要再加个类型显示实例化:

cpp 复制代码
template
double Add<double>(const double& left, const double& right);

运行:

cpp 复制代码
1
1

但是这样太麻烦了,干脆不要声明定义分离了,把Stack.cpp删掉,定义全部放到Stack.h里面:

相关推荐
Zfox_26 分钟前
【Linux】进程信号全攻略(二)
linux·运维·c语言·c++
起名字真南44 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去1 小时前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
cleveryuoyuo1 小时前
AVL树的旋转
c++
神仙别闹1 小时前
基于MFC实现的赛车游戏
c++·游戏·mfc
小c君tt1 小时前
MFC中 error C2440错误分析及解决方法
c++·mfc
木向2 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越2 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
hunandede2 小时前
FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介,结构体,函数
c++
hunandede3 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码,AVPacket 重要函数,结构体成员学习
c++·ffmpeg·音视频