模板(二):模板的特化与模板的分离编译

本文详细介绍了C++中的模板特化,包括函数模板和类模板的特化,以及全特化和偏特化的区别。同时探讨了模板的分离编译问题及其解决方法,如将模板声明与定义放在同一文件、使用显示实例化等。此外,文章还提及了模板的函数签名和模板的模板参数相关概念。
摘要由CSDN通过智能技术生成

我的人生可以有把玩单调的时间,但没有忍受厌倦的余地
                               ——《海边的卡夫卡》

模板的特化

  特化是在一个统一的模板不能在所有类型实例下正常工作时,需要定义类型参数在实例化为特定类型时函数模板的特定实现版本。
  特化必须在同一命名空间下进行,可以特化类模板也可以特化函数模板, 模板实例化时会优先匹配”模板参数”最相符的那个特化版本。

1. 类模板可以全特化和偏特化,类模板不支持重载
2. 函数模板只能全特化,函数模板支持重载

全特化的模板参数列表应当是空的,并且应当给出”模板实参”列表.

// 全特化函数模板
template<> 
//const char* Max<const char*>(const char* left, const char* right)
const char* Max<>(const char* left, const char* right)//省略"模板实参"
{
    return (strcmp(left, right) > 0) ? left : right;
}

// 全特化类模板
template <>
class SeqList <int>
{
public :
    SeqList(int capacity);
    ~ SeqList();
private :
    int _size ;
    int _capacity ;
    int* _data ;
};

注意类模板的全特化时在类名后给出了”模板实参”,但函数模板的函数名后没有给出”模板实参”。 这是因为编译器根据const char* Max<>(const char* left, const char* right)的函数签名1.可以推导出来它是T Max(T left, T right)的特化。
  但是如果通过函数签名无法推导出特化版本的源模板,这是就需要写出”模板实参”.

//反例
template <class T>
void f(){ T d; }

template <>
void f(){ int d; }

此时编译器无法推导出f()是由f<T>()特化来的,编译时会有错误:
error C2912: 显式专用化;“void f<>(void)”不是函数模板的专用化
这时我们便需要显式指定”模板实参”:

template <class T>
void f(){ T d; }

template <>
void f<int>(){ int d; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值