模板笔记007 - 模板的声明、形参、实参

本文详细介绍了C++中的模板,包括模板的声明、模板参数(形参)、模板实参。讨论了类模板和函数模板的基本概念,以及模板参数的类型参数、非类型参数和模板的模板参数。还提到了模板实参的显式指定、实参推导以及模板实参的限制。此外,文章还涵盖了模板的友元函数和友元模板的相关知识。
摘要由CSDN通过智能技术生成

模板笔记007 - 声明 形参 实参

声明

  • 类模板和函数模板是c++的两种基本类型的模板
    模板的声明需要引入一个参数化子句:template <...>

  • 联合模板也是类模板的一种

  • 和普通的函数一样,模板函数也可以有缺省参数

template <typename T>
void func1(Stack<T> const&, int max =10)
{}

template <typename T>
void func2(Array<T>*, T const& = T的默认构造 ) // 只是为了语法高亮,后一个参数是 T const& = T()
{}

对于基本类型,T()为0

  • 参数化除了用在两种基本类型的模板之外,还可以用于一下三种声明:

    1. 类模板成员函数的定义
    2. 类模板嵌套类成员的定义
    3. 类模板的静态数据成员的定义

    需要注意的是上面3种特殊的情况都不是模板

    template <int I>
    class A
    {
        void open();
        class B;
        static int num;
    };

    template <int I>
    void A<I>::open()
    {}

    template <int I>
    class A<I>::B
    {};

    template <int I>
    int A<I>::num = 0;

上面这3种情况,都不是使用自身的模板,而是使用外围类模板,参数也是由外围类模板决定
书上并不建议我们称她们为模板

  • 虚函数

    成员函数模板不能称为虚函数,相反,类模板的普通成员函数可以成为虚函数

  • 每个模板都有一个名字,且在所属作用域下是唯一的
    int a;
    class a; // ok

    template <typename T>
    class a; // error
  • 模板名字具有链接
    extern "C++" template <typename T>
    void func1() {} // 标准链接,是默认的,可以忽略不写,一般也没有写

    extern "C" template <typename T>
    void func2() {} // error, 不能有C链接

    extern "python" template <typename T>
    void func3() {} // ok, 非标链接,属于兼容性链接,目前(2002年)还没有编译器实现,

模板通常具有外部链接(唯一的例外是static函数模板),所以函数内部不能声明模板(因为函数内部都是局部对象,不能保证模板名字的唯一性)

模板的声明只能出现在namespace scope或是class scope里

  • 模板的基本类型有两种:类模板和函数模板。那什么叫基本模板?

    即普通声明(没有在模板名称后面加< >)

    template <typename T> class A;
    template <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值