template学习之零值初始化及字符串常量作(function template argument)函数模版参数问题

来源:互联网 发布:北京纸箱厂 淘宝彩色 编辑:程序博客网 时间:2024/05/22 09:38


本篇只是摘抄自《c++ template》小问题比较少注意,而且也容易忘记
1 零值初始化
对于基本的数据类型int,double,pointer type来说,一般没有default构造式对其初始化,比如下面的代码
void foo(){
int x; //x的值不定
int *ptr; //ptr的指向也不定
}
如果在template中使用这样的代码,如下
template <typename T>
void foo(){
T x;
}
如果上面的的T是基本数据类型时,x的值就没有初始化,所以这样的方法是不能保证值一定被初始化的,我们知道有些时候变量没有初始化可能对导致程序一些意想不到的问题,为了解决这样的问题,我可以在宣告内建型别时显示调用default构造式,像下面这样的情况
template <typename T>
void foo(){
T x = T();//如果T是内建型别,比如int,double等,x也会初始化为0
}
在class template的成员中,也可能出现这样的情况。所以一般需要使用类的参数初始化列表如下:
template <typename T>
class MyClass{
private:
T x;
public:
MyClass(): x(){//这样也可以确保,即使T是基本类型,也能对x进行初始化
}
};


2 以字符串常量作为Function Template Argument 
比如下面的代码:
#include <string>


template <typename T>
inline T const &max (T const & a,T const &b){
return a > b ? a:b;
}


int main(){
std::string s;
::max("apple","peach");// Ok,型别相同
::max("apple","tomato");//Error,型别不同
::max("apple",s);//Error,型别不同
}
问题在于字符串字面常数的长度不同,因而其底层的Array型别也不同,具体的为"apple"和“peach”的型别都为char const [6],而“”tomato“的型别为char const[7],所以会有问题,当使用by value的传值形式时,可以解决一点问题,但是也会引起不必要的拷贝。具体如下:
template <typename T>
inline T max(T a ,T b){
return a > b ? a:b;
}


则上面的第一个和第二个正确,第三个仍然错误,先记住这些,具体解决办法请参考《c++ Template》

原创粉丝点击