首页 > 其他分享 >【模板代码的组织结构与模板的显式实例化和声明】模板代码的组织结构与模板的显式实例化和声明

【模板代码的组织结构与模板的显式实例化和声明】模板代码的组织结构与模板的显式实例化和声明

时间:2024-09-17 22:51:02浏览次数:14  
标签:__ 实例 template 显式 cpp main 模板

一、模板的组织结构

之前对于模板,我们都是写在同一个 . c p p .cpp .cpp文件下,那如果我们将模板分开,单独开一个 . h .h .h和 . c p p .cpp .cpp来创建模板,会发生什么?

首先,我们创建一个 m y c l a s s . h myclass.h myclass.h文件,写入以下代码:

#ifndef __MYCLASS_H__
#define __MYCLASS_H__
#include<iostream>
template<typename T>
class MYClass {
public :
	void func();
};
#endif 

注意这里的代码是防止多次引用头文件

#ifndef __MYCLASS_H__
#define __MYCLASS_H__

然后我们创建一个 m y c l a s s . c p p myclass.cpp myclass.cpp文件,类外实现一下模板

template<typename T>
void MYClass<T>::func() {
	std::cout << "MYClass::func成员函数执行了\n";
}

然后再主函数 m a i n . c p p main.cpp main.cpp内写入:

#include "myclass.h"

int main() {
	MYClass<int> myc;
	myc.func();

	return 0;
}

看上去没什么问题,编译器也没有报错,我们运行一下:
在这里插入图片描述
显然,这里链接失败了,原因如下:

编译器首先在 m a i n . c p p main.cpp main.cpp中尝试实例化出 M Y C l a s s < i n t > MYClass<int> MYClass<int>这个类,由于在当前编译单元找不到 M Y C l a s s MYClass MYClass类模板的实现,编译器不会因此报错,而是假设在别的编译单元已经实例化出了这个类。但是链接的时候发现别的编译单元也没有实例化出这个类,因此就会发生链接错误。

因此,解决方法就是在 m y c l a s s . h myclass.h myclass.h文件中就完成模板的实现,这样在引用头文件的时候就不会因为编译器的忽略而发生链接错误了:

template<typename T>
class MYClass {
public:
	void func() ;

};

//直接再.h文件内实现
template<typename T>
void MYClass<T>::func() {
	std::cout << "MYClass::func成员函数执行了\n";
}

编译运行:
在这里插入图片描述

二、模板的显式实例化、模板声明、代码组织结构

如果多个 . c p p .cpp .cpp文件调用同一个模板,可能会实例化出多个相同的实例模板,我们可以通过对模板的显式实例化和声明来避免多次实例化。

我们加入 c a . h ca.h ca.h,在里面定义一些模板

#ifndef __CAH__
#define __CAH__
#include<iostream>
template<typename C>
class A {
public:
	//成员函数模板
	template<typename T2>
	A(T2 v1, T2 v2); 

	template<typename T>
	void myft(T tmpt) {
		std::cout << tmpt << "\n";
	}
	

	C m_ic;
};

//类外实现构造函数
template<typename T>
template<typename T2>
A<T>::A(T2 v1,T2 v2) {
	std::cout << v1 << " " << v2 << "\n";
}

//定义一个函数模板
template<typename T>
void myfunc(T v1, T v2) {
	std::cout << v1 + v2 << "\n";
}

#endif 

这里有构造函数模板和成员函数模板。
然后我们在 t e s t . c p p test.cpp test.cpp和 m a i n . c p p main.cpp main.cpp中调用这些模板:

t e s t . c p p test.cpp test.cpp:

#include "ca.h"

void myfunc() {
	A<float>a(1, 2);
	a.myft(3);

	myfunc(1, 2);
}

m a i n . c p p main.cpp main.cpp:

#include "ca.h"

int main() {
	
	A<float>a(1, 2);
	A<float>a2(1.1, 2.2);

	a.myft(3);

	myfunc(1, 2);

	return 0;
}

这样我们会实例化出多个 A < f l o a t > A<float> A<float>和 m y f u n c ( ) myfunc() myfunc()函数,那么我们可以通过模板声明和显式实例化来避免:
在 t e s t . c p p test.cpp test.cpp和 m a i n . c p p main.cpp main.cpp进行更改:
在这里插入图片描述
在这里插入图片描述加入以上的内容,注意,实例化声明可以有多个,而实例化定义只能有一个,且必须在定义后才能声明。
这样我们实例化出的模板只会有一个,然后通过在链接的时候就会在别的 . c p p .cpp .cpp文件中找到这个定义。

注意的是,这样的显式实例化定义,如 t e m p l a t e A < f l o a t > template A<float> templateA<float>,会将类 A A A中所有的内容都实例化出来,这样也会带来额外的开销。

总之,对于实例化定义和声明有其优秀的一面,也有其不好的一面,要看实际情况来选择具体的方法。

标签:__,实例,template,显式,cpp,main,模板
From: https://blog.csdn.net/Antonio915/article/details/142318130

相关文章

  • C++模板函数实现类型推导
    C++模板函数实现类型推导以快读函数举例说明无法类型推导的情况template<typenameT>inlineTread(){Tx=0;intf=1;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar(......
  • 828华为云征文 | 云服务器Flexus X实例:one-api 部署,支持众多大模型
    目录一、one-api介绍二、部署one-api2.1拉取镜像2.2部署one-api三、运行one-api3.1添加规则3.2运行one-api 四、添加大模型API4.1添加大模型API五、总结本文通过 Flexus云服务器X实例部署one-api。Flexus云服务器X实例是新一代面向中小企业和开发......
  • 模板方法模式
    模板方法模式模板方法模式(TemplateMethodPattern)是一种行为设计模式,它定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重写算法的某些步骤。通过这种模式,能够复用算法的整体流程,同时又能够灵活调整某些具体步骤的实现。模板方法模式的关键要素抽象类(AbstractClass......
  • 828华为云征文 | 云服务器Flexus X实例:轻量级http服务器 Tinyhttpd 部署
    目录一、云服务器Flexus二、Tinyhttpd介绍三、部署Tinyhttpd四、运行4.1编译项目4.2运行项目五、总结Flexus云服务器X实例是华为云推出的一款高性能、高可靠性的云服务器产品,它专为满足企业级用户对计算资源的严格要求而设计。本篇文章通过部署 轻量级http服务......
  • 秒抢演唱会门票通用模板
     Python脚本使用了Selenium库来自动化web浏览器操作,目的是自动化购票流程。脚本的主体是一个名为`Concert`的类,用来处理从登录到购票的所有步骤。以下是代码中关键部分的详细解释: ###类定义:`Concert``Concert`类负责配置和执行整个购票流程,它的构造函数接收多个参数来定......
  • shopify主题开发之template模板解析
    在Shopify主题开发中,template 文件是核心部分,它们定义了店铺中不同页面的布局和结构。下面将详细介绍Shopify主题中的 template 模板。一、template文件结构在Shopify主题中,templates 文件夹包含了所有用于生成店铺页面的模板文件,使用两种不同的文件类型:JSON和L......
  • C++入门基础知识71(高级)——【关于C++ 模板】
    成长路上不孤单......
  • 贪心算法(算法详解+模板+例题)
    1.贪心是什么贪心算法(GreedyAlgorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好的策略。虽然这种策略并不保证一定能得到全局最优解,但在许多情况下,它能提供近似最优解,而且计算效率高。贪心算法通常适用于那些具有“最优......
  • 【C++】模板进阶:深入解析模板特化
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与Queue本章将......
  • 08.tomcat多实例
    在加两个tomcat实例[root@web01~]#llapache-tomcat-8.0.27.tar.gz-rw-r--r--1rootroot912861010月52015apache-tomcat-8.0.27.tar.gz[root@web01~]#tarxfapache-tomcat-8.0.27.tar.gz[root@web01~]#cp-aapache-tomcat-8.0.27tomcat_8081[root@web01~]......