函数模板和具体化
以下一个函数模板和一个具体化为什么声明不对?
- 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 );
[解决办法]
[解决办法]
其实只要去掉模板定义时的const关键字即可。
模板特化(具体化)过程中的关键一步是:根据特化的声明去寻找对应的原始模板。
在你这个例子中,首先模板名称已经定了,就是maxn,那就到所有名字是maxn的函数模板中去查找。
其次就是比较参数了,看看参数(模板实参、形参)之间是否可以正确推演。
因为在你的模板实参中带有const修饰符,所以编译器就会拿“const char **”、“const char *”去(反)推演形参。第一个显然没有(如果模板声明成const T **就匹配了),第二个自然也没有(const const char *)显然不符合语法。
所以,导致的错误就是“无目的特化”。