模板template前奏

使用模板时,会和以前学过的知识结合起来,注意不要出什么错误。

case1:

template<typename T>
T& fun(const T &a)
{
    return a;    // error: can not convert from 'const int' to 'int &'
}

case2:

template<typename T>
T& fun(const T &a)
{
    T b;
    return b;   // warning: reference to local variable ‘b’ returned
}

 

当实参是数组的时候,函数模板变得复杂起来,更容易出错:

case3: 函数形参是非常量、非引用的

template<typename T>
int compare(T a, T b)
{
    if(a<b)
        return 1;
    if(b<a)
        return -1;
    return 0;
}

cout << compare("ff","ggg") << endl; // 此时 T 为 const char *,它们比较的是a和b这两个常量指针的大小,而不是内容的大小;a和b的值可以改变,但是它们所指向的内容不能改变
char s1[3] = "d", s2 = "g";
cout << compare(s1,s2) << endl;  // 此时 T 为  char *,它们比较的是a和b这两个指针的大小,而不是内容的大小;a和b的值可以改变,它们所指向的内容也可以改变

case4: 函数形参是常量、非引用的

template<typename T>
int compare(const T a, const  T b)
{   
    if(a<b)
        return 1;
    if(b<a)
        return -1;
    return 0;
}
cout << compare("ff","ggg") << endl; // 此时 T 为 const char * conat,它们比较的是a和b这两个常量指针的大小,而不是内容的大小;a和b的值不能改变,它们所指向的内容也不能改变
char s1[3] = "d", s2 = "g";
cout << compare(s1,s2) << endl;  // 此时 T 为  char * const,它们比较的是a和b这两个指针的大小,而不是内容的大小;a和b的值不能改变,但是它们所指向的内容可以改变

case4: 函数形参是引用的

template<typename T>
int compare(T &a, T &b)
{
    if(a<b)
        return 1;
    if(b<a)
        return -1;
    return 0;
}
cout << compare("dd", "ggg") << endl; // error: no matching function for call to ‘compare(const char [3], const char [4])’
char s1[4]="dd", s2[5]="ff";
cout << compare(s1,s2) << endl; //  error: no matching function for call to ‘compare(char [4], char [5])’
cout << compare("ddd", "ggg") << endl; // error: 它们比较的是a和b这两个指针的大小,而不是内容的大小

 

posted on 2014-05-17 16:10  江在路上2  阅读(102)  评论(0)    收藏  举报