您现在的位置是:首页 > 正文

类模板&函数模板&从属类型

2024-04-01 01:05:33阅读 1

准备看个项目找实习,边看边学,一看到处都是template 和typename,好几年前学的C++都忘记光了,在这里先做个笔记复习一下。

template <class T>
T abs(T x) {
    if(x < 0) return -x;
    return x;
}
int main()
{
    int x = 1;
    cout << abs(x);
    return 0;
}

上面是一个函数模板的例子,注意class改成typename在这种场景是一摸一样的。

函数模板VS模板函数

上面这玩意儿叫做函数模板,这两个容易搞混,就好像豆腐一碗和一碗豆腐,我们把重点放在后面

函数模板就是模板,模板函数就是函数。

函数模板本质上是函数重载的一种实现,在定义函数模板的时候是不是有自定义类型<class T> 或者<typename T>,当上面代码中abs(x)的时候,就会生成一个模板函数,将class T变成int类型,这个生成的重载函数就叫做模板函数。

从函数模板产生的模板函数都是同名的,C++在编译的时候会将重载函数取名字

例如

void foo(int x, int y);

C 编译之后在符号库中的名字为_foo,而C++编译器会产生像_foo_int_int之类的名字,这也是C++支持重载的原因(想了解更多可以搜一下extern C)。

那么在生成这个模板函数的过程中,万一有多个同名的重载函数,编译器会按照哪一个生成呢?

答案是:非模板函数>模板函数>类型转换。https://blog.csdn.net/Slience_Perseverance/article/details/20574423


类模板:

类模板的成员函数被认为是函数模板,因此当给出一个类模板的成员函数定义必须遵循函数模板的定义。

首先看类模板格式

template <typename T>
class Array
{
    int size;
    T *p;
public:
    Array();
    Array(int n);
    T &operator[](int) const;
};

看上面黑体字,按照函数模板定义类成员函数

template <typename T>
Array<T>::Array()
{
    size = 10;
    p = new T[size];
}
template <typename T>
Array<T>::Array(int n)
{
    size = n;
    p = new T[size];
}
template <typename T>
T& Array<T>::operator[] (int i) const
{
    if(i >= 0 && i < size)
        return p[i];
}

这个就是对那个重载成员函数进行实现的代码。

在类模板之外定义成员函数就要按照上面这种方式。

类模板实例化

Array<int> m;
Array<int> m(5);

都是可以的,可以自行测试。


从属类型

上面的打了一遍之后就熟悉了,但是在看项目的过程中,我又发现了一种函数模板没见过的写法,

第二行开头怎么有个typename?我记得书上是没有的呀

去掉试试?

error: need ‘typename’ before ‘CTP::MakeUniqueResult<T>::scalar’ 
because ‘CTP::MakeUniqueResult<T>’ is a dependent scope
 MakeUniqueResult<T>::scalar make_unique(

报错了,说这是dependent scope,必须要有这个typename,

https://blog.csdn.net/ljlinjiu/article/details/89384836?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%BB%8E%E5%B1%9E%E7%B1%BB%E5%9E%8B(dependent%20type),&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-89384836.142^v73^insert_down3,201^v4^add_ask,239^v2^insert_chatgpt&spm=1018.2226.3001.4187

上面这篇文章写的很详细。

大概意思就是如果不指明,编译器可能会不把它当成一个类型,而把他当成一个静态成员变量。

网站文章

  • 企业级负载均衡集群——lvs的DR模式下的健康检测(Idirectord)

    DR模式中的名词解释DS 调度器,lvs的前端设备RS 真正提供服务的后端服务器RIP 后端服务器的ip地址DIP 调度器和后端服务器通信的ip源IP CIP(客户端的IP)目的IP VIP(设置的统一入口),对外公布的ip,客户请求进来的ip源MAC地址 DS调度器的MAC地址目的MAC地址 RS真正服务器的MAC地址...

    2024-04-01 01:05:27
  • BS几种技术及它们之间关系

    BS几种技术及它们之间关系

    一、简介 HTML 1、定义 1)HTML(Hypertext Markup Language): 超文本标记语言,它是描述网页的结构和样式的一种标签语言,旨在显示数据。 Hypertext:不是一般的文本语言的,它的“超”体现在它描述的东西能够在网页上显示。 MarkupLanguage:它并非编程语言,而是由标签组成的语言。 2)标签: 或 3)HTML文档:包括HTML标签和

    2024-04-01 01:05:20
  • 用do while循环计算1+1/2!+1/3!+...+1/20!的前20项和

    用do while循环计算1+1/2!+1/3!+...+1/20!的前20项和

    用do while循环计算1+1/2!+1/3!+...+1/20!的前20项和

    2024-04-01 01:04:54
  • HDU 4612 Warm up(边双连通、树的直径)

    题意: N≤2×105个点,M≤106条边的无向图,有重边N\le 2\times 10^5个点, M\le10^6条边的无向图, 有重边 现在要添加一条边,问添加后剩余最小的桥数是多少现在要添加一条边, 问添加后剩余最小的桥数是多少分析: 套路题,边双连通缩点建树之后,显然要形成一个最大的环让桥数变的最少套路题, 边双连通缩点建树之后, 显然要形成一个最大的环让桥数变的最少

    2024-04-01 01:04:48
  • docker日志

    docker日志

    高效的监控和日志管理对保持生产系统持续稳定的运行以及排查问题至关重要。 在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要。考虑到容器短暂和不固定的生命命周期,当我们...

    2024-04-01 01:04:41
  • Ubuntu搭建GPU版本的百度Apollo3.5或5.5自动驾驶平台

    Ubuntu搭建GPU版本的百度Apollo3.5或5.5自动驾驶平台

    Ubuntu16.04搭建百度Apollo3.5步骤详解一、安装ubuntu16.04二、安装git-lfs三、添加SSH密钥四、下载Apollo镜像五、设置Docker环境六、安装ros-indig...

    2024-04-01 01:04:15
  • Kali工具信息收集

    Kali工具信息收集

    Kali工具信息收集 一、DNS信息收集 1、fierce介绍,在一个安全的环境中,暴力破解DNS的方式是一种获取不连续IP地址空间主机的有效手段。fierce工具可以满足这样的需求,而且已经预装在K...

    2024-04-01 01:04:06
  • nio读取文件,输出文件

    io流的一种:package com.cxy.ssp.Automic;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.util.conc...

    2024-04-01 01:03:54
  • 设计模式之建造者模式

    设计模式之建造者模式

    23种设计模式之建造者模式

    2024-04-01 01:03:29
  • 类中静态变量未定义导致undefined reference to static class member问题的解决方法

    undefined reference to ***这个链接错误的花样总是层出不穷(more),这一次是找不到类中的成员。 例子1:undefined reference to VS. 类静态成员变量 在文件A.h中声明了类A与类B: class A { friend class B; static int pa; // 注:这里把成员变量声

    2024-04-01 01:03:22