C++基础学习-31成员函数模板,模板显式实例化与声明

2023-11-10

一、普通类的成员函数模板

不管是普通类还是类模板,它的成员函数都可以是个函数模板,成为"成员函数模板",不可以是虚函数,否则编译器会报错。

class A
{
public:
	template<typename T>
	void myft(T tmpe)
	{
		cout << tmpe << endl;
	}
};
int main()
{
	A a;
	a.myft(10);  //编译器在遇到这条语句时,编译就会实例化这个函数模板。
	return 0;
}

二、类模板的成员函数模板

类模板的模板参数必须用<>指定,成员函数模板(函数模板)的参数可以推断。
类模板的成员函数(包括普通成员函数 / 成员函数模板)只有为程序所用(代码中出现了对该函数或者该函数的模板调用时)的时候才会进行实例化。
如果某函数从未使用,则不会实例化该成员函数。

template<typename C>
class A
{
public:
	void print()
	{
		cout << m_ic << endl;
	}

	template<typename T2>
	A(T2 v1, T2 v2);  //构造函数也引入自己的模板参数T2,和整个类的模板参数C没有关系
public:
	C m_ic;
};

template<typename C>
template<typename T2>
A<C>::A(T2 v1, T2 v2)
{
	m_ic = v1;
	cout << v1 << " " << v2 << endl;
}

int main()
{
	A<float> a1(1, 2);  //实例化了一个A<float>类,并用int类型来实例化构造函数
	A<float> a2(1.1f, 2.2f);  //A<float>已经被上面代码进行实例化了,这里用float来实例化构造函数
	a1.print();
	a2.print();
	return 0;
}

三、模板显式实例化与声明

为了防止在多个.cpp文件中都实例化相同的类模板,所以C++11提出了一种解决方法,我们称为"显式实例化"。
通过"显式实例化"来避免这种生成多个相同类模板实例的开销
A tmpobj(6, 7);
模板的实例定义只有一个,实例化声明可以有多个。

#pragma once
#ifndef __CAH__
#define __CAH__

#include <iostream>
using namespace std;

template<typename C>
class A
{
public:
	template<typename T2>
	A(T2 v1, T2 v2);

	template<typename T1>
	void myft(T1 tmpt)
	{
		cout << tmpt << endl;
	}
public:
	C m_ic;
};

template<typename C>
template<typename T2>
A<C>::A(T2 v1, T2 v2)
{
	m_ic = (C)v1;
	cout << v1 << " " << v2 << endl;
}

#endif // !__CAH__


#include <iostream>
#include <vector>
#include "ca.h"
using namespace std;

extern template A<float>;

void mfunc()
{
	A<float> a(1, 2);
};


#include <iostream>
#include <vector>
#include "ca.h"
using namespace std;

extern template A<float>;

int main()
{
	A<float> a1(1, 2);
	A<float> a2(1.1, 2.2);
	a1.myft(3);
	return 0;
}

显示实例化实例化声明
extern template A; //其他的所有.cpp文件中都这么写 extern:定义外部变量
extern template void myfunc(int v1, int v2);

extern作用:不会在文件中生成一个extern后面所表示的模板的实例化版本代码
extern目的:告诉编译器,其他的源文件(.cpp)中已经有了一个该模板的实例化版本了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础学习-31成员函数模板,模板显式实例化与声明 的相关文章

随机推荐

  • android项目嵌入flutter且解决的问题

    1 在android原生根目录下通过运行命令创建flutter module 这种创建与 flutter new project 内部目录结构不一样 所以直接用命令去创建 2 new Binding 如果标识红色报错 那就看看flutter
  • errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint

    微信access token 在一个地方获取了 同一个公众号其它地方获取的access token 都会失效 就会出现标题中的错误 这个原因可能大家都知道 但是排除的时候可能不好排除 我找了一上午在系统里面 都没有找到 因为自己负责的系统全
  • ReactNative入门(二)——导航和路由

    React Navigation官方文档 https reactnavigation org docs getting started 安装react navigation npm install react navigation nati
  • 临时变量生命期

    有关临时对象的生命周期有三种情况 一般情况 临时性对象的被摧毁 应该是对完整表达式 full expression 求值过程中的最后一个步骤 该完整表达式造成临时对象的产生 以及两个特殊情况 凡含有表达式执行结果的临时性对象 应该存留到ob
  • 网络安全与网站安全及计算机安全:如何使用Kali Linux的Rarcrack获取RAR压缩文件加密密码?

    知识点详解 1 1 Rarcrack是一款获取压缩文件密吗的软件 但是仅支持zip rar和7z三种类型 1 2 在kali操作系统中是没有此工具的 所以就必须先安装才能使用 1 3 安装Rarcrack的指令 apt install ra
  • 测试博客

    在这里插入代码片 TOC Markdown编辑器的使用 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何使用Markdown编辑器 可以仔细阅读这篇文章 了解一下Markdown的基本语法知识 新的改变 我们
  • 【备忘】清理Office缓存

    背景 电脑安装了M365 Apps for enterprise的客户端 遇到不常见的奇怪问题 尝试看清理缓存是否可以解决 清理步骤 1 关闭所有Office365 应用 2 搜索 AppData 并打开该文件夹 3 进到 AppData
  • java开发Demo~×××扫码支付,java开发示例

    开发所需工具类 开发所需jar 具体的代码不贴了 说明下PayConfigUtil中的参数 APP ID和APP SECRET在公众平台 MCH ID和API KEY在商户平台 其中API KEY是自己设置的 并不是自动生成的 Contro
  • element-variables

    Element Chalk Variables Transition all transition all 3s cubic bezier 645 045 355 1 default fade transition opacity 300m
  • Linux——进程退出

    目录 一 进程退出时有三种选择 1 1 echo 命令 功能 打印距离现在最近一次执行某进程的退出码 例2代码 例3 例4代码 1 3 进程运行过程中可能会出现的错误种类 二 总结 一 进程退出时有三种选择 1 使用return 语句 2
  • Python常见的开发工具合集对比

    Python是一种功能强大且易于学习的编程语言 被广泛应用于数据科学 机器学习 Web开发等领域 随着Python在各个领域的应用越来越广泛 越来越多的Python开发工具也涌现出来 但是 对于新手来说 选择一款合适的Python开发工具可
  • 反向电压极性保护电路

    反向电压极性保护电路 原文地址点击这里 电压反接保护 Reverse Voltage Protect RVP 电路主要用在需要直流电压供电电源的输入端 用于防止输入电压极性反接而造成电路系统元器件的损坏 甚至事故 大多数电路系统都需要极性正
  • Xcode8不能在iOS7上调试,Could not find Developer Disk Image的解决方法

    升级完Xcode8之后 默认情况下 是无法进行iOS7的调试的 因为Xcode8里面不再游iOS7的镜像文件 所以会提示 Could not find Developer Disk Image 解决方法如下 打开finder 应用程序 Xc
  • $.ajax()常用参数,JQuery中$.ajax()方法参数详解

    url 要求为String类型的参数 默认为当前页地址 发送请求的地址 type 要求为String类型的参数 请求方式 post或get 默认为get 注意其他http请求方法 例如put和 delete也可以使用 但仅部分浏览器支持 t
  • 1003 Emergency (25分) PAT 甲级

    1003 Emergency 25分 As an emergency rescue team leader of a city you are given a special map of your country The map show
  • UnityAPI:AndroidJavaClass和AndroidJavaObject

    AndroidJavaClass 和 AndroidJavaObject的区别 AndroidJavaClass 构造函数 当Java类构造函数无参数时使用 AndroidJavaObject 构造函数有多个重载 当Java类构造函数有参数
  • 系统端口详解

    Mon Dec 20 05 40 51 2004 UTC This services files is an attempt at collating the various port numbers lists that I ve enc
  • 【整理六】

    1 props和state相同点和不同点 render方法在哪些情况下会执行 props是一个从外部传进组件的参数 由于React具有单向数据流的特性 所以他的主要作用是从父组件向子组件中传递数据 它是不可改变的 如果想要改变它 只能通过外
  • windwos自带端口转发功能

    端口转发配置 netsh interface portproxy add v4tov4 listenport 1526 listenaddress 192 168 10 100 connectport 1522 connectaddress
  • C++基础学习-31成员函数模板,模板显式实例化与声明

    目录 一 普通类的成员函数模板 二 类模板的成员函数模板 三 模板显式实例化与声明 一 普通类的成员函数模板 不管是普通类还是类模板 它的成员函数都可以是个函数模板 成为 成员函数模板 不可以是虚函数 否则编译器会报错 class A pu