模版收尾
模版的声明和定义不能分离,否则会报错.
写下面三个文件:
Stack.h
#pragma once
#include<iostream>
using namespace std;
template <class T>
T Add(const T& left, const T& right);
Stack.cpp
#include"Stack.h"
template <class T>
T Add(const T& left, const T& right)
{
cout << 1 << endl;
return left + right;
}
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.显示实例化:
缺点:换类型之后还要重新显示实例化,假设我此时这样写:
Add(1.0, 2.0);
就会报错:
1>Test.obj : error LNK2019: 无法解析的外部符号 "double __cdecl Add<double>(double const &,double const &)" (??$Add@N@@YANABN0@Z),函数 _main 中引用了该符号
需要再加个类型显示实例化:
template
double Add<double>(const double& left, const double& right);
运行:
1
1
但是这样太麻烦了,干脆不要声明定义分离了,把Stack.cpp删掉,定义全部放到Stack.h里面: