C++ 函数模板、具体化模板的分文件书写

news2024/10/6 18:29:25

函数模板分为普通函数模板和具体化函数模板

普通函数模板:函数模板只是函数的描述符,没有实体,创建函数模板的代码整体放在头文件中;

具体化函数模板:具体化函数模板有实体,编译时和普通函数一样,所以声明放在头文件中,定义放在源文件中;

以下是未分文件书写时的代码:

main.cpp

#include <iostream>
using namespace std;

// 普通函数
void test(int a,int b)
{
    cout <<"调用了普通函数"<<endl;
}

// 函数模板
template<typename tab>
void test(tab a,tab b)
{
    cout <<"调用了普通函数模板"<<endl;
}

// 具体化函数模板
template<>
void test(int a,int b)
{
    cout <<"调用了具体化函数模板"<<endl;
}

int main()
{
    test(10,20);
    test('a','c');
    test<>(2,5);
}

下面是分文件书写的代码,我直接给出结果:

public.h

#ifndef __PUBLIC_H__
#define __PUBLIC_H__

#include <iostream>
using namespace std;

// 普通函数声明
void test(int a, int b);

// 普通模板只是函数的描述,没有实体,所以应该全部放到头文件中
template<typename tab>
void test(tab a, tab b)
{
	cout << "使用了普通函数模板" << endl;
}

// 具体化函数模板有实体,编译的原理和普通函数一样,所以头文件声明
template<>
void test(int a, int b);

#endif

public.cpp

#include "public.h"

// 普通函数实现
void test(int a,int b)
{
	cout << "使用了普通函数" << endl;
}

// 具体化模板实现
template<>
void test(int a,int b)
{
	cout << "使用了具体化函数模板" << endl;
}

main.cpp

#include "public.h"

int main()
{
	test(10, 20);
	test('a', 'c');
	test<>(20, 30);
}

可以正常编译,且运行的结果是一样的;

首先需要注意的是:函数模板的声明要在具体化模板的上方

另外,上面我们是把函数模板的整个代码都放到了头文件中,这是正确的,如果分文见书写,会出错,如下:

编译没问题:

 

运行:

 

先把代码还原

如果把具体化模板的声明和实现都放到头文件中,也会出错,如下:

编译:

 

没有问题,运行:

 

总结 

1、具体化函数模板的声明要放到普通函数模板的下方

2、函数模板只是函数的描述符,没有实体,应该把整个函数模板放到头文件中;具体化函数模板有实体,编译过程和普通函数一样,所以应该把声明放到头文件中,实现放到源文件中

以上只是一种编程习惯,可能会有其他办法把普通函数模板的声明和实现也分开,但是没有必要,只要能正常运行就可以了;

以上便是文章的全部内容,感谢观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux多线程互斥量与原理剖析

这里我们简要介绍了线程间互斥相关的概念&#xff0c;并对加锁的一种原理进行了剖析&#xff0c;本人目前理解尚浅&#xff0c;若文中有表述不当的地方还望理解并指正&#xff0c;谢谢大家&#xff01; 文章目录一&#xff1a;线程间互斥相关背景概念二&#xff1a;互斥量mutex…

摄影测量学:期末考试重点总结

本文参考《摄影测量学》 (王佩军&#xff0c;徐亚明 编著)&#xff1b; 01 不同阶段的摄影测量的对比&#xff0c;课本表1-1 &#xff08;原始资料、投影方式、仪器记不住&#xff0c;那名字总该记住吧&#xff1f;模拟摄影测量、解析摄影测量、数字摄影测量&#xff09; 02 量…

Python中的所有运算符以及运算符的优先级

文章目录前言一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、位运算符六、运算符的优先级案例实战总结前言 运算符是一些人为定义的特殊符号&#xff0c;比如我们生活当中最常见的 、-、、&#xff0c;它们主要用于数学计算、比较大小和逻辑运算等等。那这些运…

数字孪生医院的智能化运营平台建设内容

随着国务院办公厅《关于推动公立医院高质量发展的意见》印发&#xff0c;高质量发展已成为医院发展的主旋律。当前市场经济正处于增长速度换挡期&#xff0c;医院面临着转型发展的紧迫性&#xff0c;运 用新一代信息技术促进医院管理体系与管理能力现代化发展势在必行。基于数字…

读论文---DETR

DETR 深度学习之目标检测(十一)--DETR详解_木卯_THU的博客-CSDN博客_detr 下面内容取材自上述博客和唐宇迪视频

20221229英语学习

今日新词 premier adj.首要的, 最著名的, 最成功的, 第一的 microscopic adj.极小的&#xff1b;需用显微镜观察的&#xff1b;使用显微镜的 complaint n.抱怨&#xff1b;埋怨&#xff1b;投诉&#xff1b;控告 moth n.蛾 prototype n.原型&#xff0c;雏形 tournament …

面试官:自动化测试都没弄明白,你怎么敢来面试 “ 软件测试开发 ” 的?

面试一直都是一个热门话题&#xff0c;测试员当然也逃不过~纵使你是一个技能全部满点的超优秀测试员&#xff0c;卡在面试这一关也是万万不可的。特别是大厂的测试员&#xff0c;他们面试所问的东西&#xff0c;你在学校通常接触不道&#xff0c;所以没有哪个应届生是一毕业啥也…

关于Nginx 用户认证、SSL证书生成配置的一些笔记

写在前面 分享一些 Nginx 用户认证、SSL 加密配置的笔记博文内容涉及 Nginx 用户认证、SSL 加密配置 Demo通过 OpenSSL 生成使用 SSL 证书、私钥和 CSR Demo 理解不足小伙伴帮忙指正 这世界的一面至始至终是表象&#xff0c;正如另一面至始至终是意志 -----《作为意志和表象的世…

涨价都涨疯了

大家好&#xff0c;我是校长。给大家推荐个好东西&#xff0c;可能大家能用得着。最近新冠肺炎闹得人心惶惶&#xff0c;噢&#xff0c;不对&#xff0c;改名了&#xff0c;叫&#xff1a;新冠感染了。只要专家建议个什么东西&#xff0c;什么东西绝对准脱销&#xff0c;而且是…

计算机软考高级好考吗?需要备考多久?

不简单&#xff0c;整体的通过率只有15%左右。 软考高级一共有五个科目。 信息系统项目管理师&#xff1a;零基础&#xff0c;有考证需求的或者从事管理的人员&#xff0c;项目经理可以考这个。 系统分析师&#xff1a;适合在项目开发过程中定制需求规格说明书&#xff0c;和编…

[内网渗透]—CS生成office宏钓鱼

简介 ​ 宏是一个批量处理程序命令,正确地运用它可以提高工作效率。微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力。如完打开word文件同时要打开某个文件的功能,必须要自己编写一段称之为宏的脚本。具体做法是在“工具”菜单“宏”-“…

图的简要介绍

1、图的基本概念 &#xff08;1&#xff09;定义 图是一种较为复杂的非线性结构。 图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为G(V,E)&#xff0c;其中&#xff0c;G表示一个图&#xff0c;V表示顶点的集合&#xff0c;E表示边的集合。 &#xff08;2&…

Cookie和Session的区别

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 Cookie和Session的区别 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4; 小王的主页…

北京智和信通:IT资产全生命周期运维监控管理方案

IT资产是企业开展正常业务运营和拓展不可或缺的资源&#xff0c;也是企业财产的重要载体。随着信息科技的快速发展&#xff0c;各企业对IT资产的依赖逐渐增强&#xff0c;IT资产的可靠性和有效性面临着愈来愈大的挑战。例如IT资产管理混乱&#xff0c;通过维护手工台账的方式进…

vue入门(一)搭建vue项目,基础显示,指令

之前接触过vue&#xff0c;但是一直不是十分清晰&#xff0c;学的云里雾里&#xff0c;最近打算再次系统的整理一下&#xff0c;重新入门。还是根据vue官方文档一步一步的来&#xff0c;但是是属于简化的那种&#xff0c;会把我的学习过程都记录下来。 1.vue项目的搭建&#xf…

linux、window跨平台的用vs编程

跨平台的用vs编程 准备 创建linux的console程序 工具 – 选项&#xff0c;找到跨平台 连接linux的服务 注意&#xff0c;需要在linux系统那边配置以下的命令 sudo apt install build-essential 验证编译器是否被成功安装 gcc --versionsudo apt install openssh-server …

基于stm32 的简单的智慧农业系统, 有上位机,有下位机

1. 实现的功能 1. 下位机&#xff08;stm32&#xff09; (keil 5 ) 1. 按键key1 中断控制 LED 3 的亮灭 2. 按键key2 中断控制 温湿度的获取&#xff0c; &#xff08;数据通过串口发送给 上位机&#xff09; 3. 智能检测温湿度是否超标&#xff0c; &#xff08;超标 开启警…

el-dialog实现拖拽功能示例代码

element UI中dialog组件经常会用到&#xff0c;如果能让其任意拖拽放到不同的位置就更好了&#xff0c;实现方法如下&#xff1a; dialogDraggable.js代码&#xff1a; import Vue from vue // v-dialogDrag: 弹窗拖拽 Vue.directive(dialogDrag, { bind(el, binding, vno…

【再学Tensorflow2】TensorFlow2的层次结构

TensorFlow2的层次结构Tensorflow的层次结构Tensorflow的低阶API示例线性回归模型准备数据定义模型训练模型DNN二分类模型准备数据定义模型训练模型Tensorflow的中阶API示例线性回归模型DNN二分类模型Tensorflow的高阶API示例线性回归模型定义模型训练模型DNN二分类模型定义模型…

微信小程序开发实战10_1 小程序支付业务介绍

移动支付已成大多数消费者日常使用的支付方式之一。移动支付拥有操作简单方便、无需带现金或银行卡&#xff0c;不用找零&#xff0c;目前超过四分之三的用户都在使用移动支付。小程序应用作为一个广泛使用的移动应用&#xff0c;自然也不会放弃移动支付这个大的蛋糕。本章将介…