一般的模板函数的专用化比较简单,先来个小例子耍一下:
template<typename tType>
tType myFunc(const tType numList[],int n){...}
template<>
int myFunc<int>(const int numList,int n){...}
但是在日常使用中会出现各种意想不到的问题,例如想要特化成字符串类型进行操作的时候(这个比较常见),经常出现“不是模板的专用化”的问题,例如下面这个样子
template<typename tType>
tType myFunc(const tType numList[],int n){...}
typedef const char * csp;
template<>
csp myFunc<csp>(csp numList,int n){...}
就会出现模板不是专用化的问题。那咋搞了??观察上下两种特化过程,会发现按道理来说上面的tType位置应该全都替换成const char *,下面我们来替换一下,像下面这样(我们用括号{}把const char *括起来,实际代码没括号,只是为了更加显眼一些):
template<>
{const char*} myFunc<const char*>(const {const char *} numList,int n){...}
会发现比例子多了一个重要的限定符 :const。好吧,加上它再试一下 ,结果是一样的错误,并且两个连续的const怎么看怎么怪异,虽然理论上看上去完美,不过貌似敬爱的编译器大人不认为这里的const char *是个可替换的类型,但是需要这个类型解决问题,那就自己创造个类型吧:
typedef const char* csp;
接下来试试这个类型行不行:
template<typename tType>
tType myFunc(const tType numList[],int n){...}
typedef const char * csp;
template<>
csp myFunc<csp>(const csp numList,int n){...}
出乎意料的竟然可以了!!!!WTF!!!好了可以用了,不过更深层次的原理我是说不清楚,希望有大神可以给出解释。