编写函数模板时,编译遇到的问题:无法解析的外部符号"void _cdel func<int>(int &)"(xxxxx),该符号在_main中被引用。
代码如下:
.h文件的设置
//hppDemo.h
#pragma once
template <typename T>
void func(T &v);
.cpp文件的设置
//hppDemo.cpp
#include "hppDemo.h"
#include <iostream>
template <typename T>
void func(T &v){
std::cout << "func" << std::endl;
}
main.cpp文件设置
#include "hppDemo.h"
#include <iostream>
using namespace std;
int main(void)
{
int data = 20;
func(data);
system("pause");
return 0;
}
模板实例化取决于编译器能否找到可用代码来创建特例(成为实例化要素)。
要创建特例,编译器不但要看到模板的声明,还要看到模板的定义。
模板实例化过程时迟钝的,即只能用函数的定义来实现实例化。
main()当中的func(data)实际上时进行模板实例化,即变成了func<int>(data)。我们知道实例化的要素,即可用代码在hppDemo.cpp文件中。但是在编译hppDemo.cpp时,编译器可以解析模板定义并检查语法,但不能生成成员函数的代码。它无法生成代码,因为要生成代码需要知道模板参数,即需要值啊都一个类型,而不是模板本省。
链接程序在main.cpp和hppDemo.cpp中找不到func<int>(data)的定义,于是报这样的错。
讲模板的定义和声明都写在.hpp文件中,在main.cpp中引入这个.hpp就可以了。
.hpp文件是c++中默认模板实现文件。
资料查找连接:http://www.360doc.com/content/12/1205/19/9200790_252334603.shtml
https://blog.csdn.net/weixin_30896657/article/details/97250582