首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

函数模板跟具体化

2012-10-08 
函数模板和具体化以下一个函数模板和一个具体化为什么声明不对?C/C++ codetemplatetypename TT maxn(con

函数模板和具体化
以下一个函数模板和一个具体化为什么声明不对?

C/C++ code
template<typename T>T maxn(const T *,const int);template<> char * maxn(const char **,const int );//Error:没有与指定类型匹配的函数模板“maxn”实例


而去掉const限定以后则能通过了,const表示变量不可修改还有其他作用?请大虾指教
C/C++ code
template<typename T>T maxn(T *,const int);template<> char * maxn(char **,const int );//去掉const, 正确。


[解决办法]
const char * 和char const *和char * cosnt的基础楼主不过关而已。
找比如《C和指针》补课吧。
[解决办法]
C/C++ code
//对于:const char *p;//p是指向const数据的指针,使用p不能修改其所指的值,即不能使用*p = other;const char **pp;//pp是指向const char *类型数据的指针,pp所指向的对象并不是const的,可以使用*pp = other;//所以可以修改如下:template<typename T>T maxn(const T *, const int);template<>char * maxn(char *const*, const int );
[解决办法]
探讨
引用:
好一个循序渐进。
你都进到模板了,那个最基础的指针知识却还有严重不足。现在不补课,会越学越痛苦。


c++ primer plus 中文第五版,第8章,迄今介绍到指针的就2小节外加一些穿插,请教下来该看的书

[解决办法]
其实只要去掉模板定义时的const关键字即可。

模板特化(具体化)过程中的关键一步是:根据特化的声明去寻找对应的原始模板。
在你这个例子中,首先模板名称已经定了,就是maxn,那就到所有名字是maxn的函数模板中去查找。
其次就是比较参数了,看看参数(模板实参、形参)之间是否可以正确推演。

因为在你的模板实参中带有const修饰符,所以编译器就会拿“const char **”、“const char *”去(反)推演形参。第一个显然没有(如果模板声明成const T **就匹配了),第二个自然也没有(const const char *)显然不符合语法。

所以,导致的错误就是“无目的特化”。

热点排行