模板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这两个指针的大小,而不是内容的大小
浙公网安备 33010602011771号