标签:
有些时候统一的一个模板不能解决所有的参数问题,例如统一的一个模板有时候不能编译,不能正确实例化,输出结果有问题
模板特例化:函数模板特化,类模板特化
例如:定义了一个compare的模板函数用比较定义了“<”的对象,如int,double以及自定义类型。
a. 为了处理字符串常量,compare("hi","com"),重载了
template<unsigned N,unsigned M>
int compare(const char(&p1)[N],const char(&p2)[M])
注:当比较的字符串长度相同时,GCC 4.83会认为与 int compare(const T& v1,const T& v2) 模糊,无法正确的实例化,编译不通过
test.cpp: In function ‘int main()’:
test.cpp:45:34: error: call of overloaded ‘compare(const char [6], const char [6])’ is ambiguous
cout<<compare("hello","hello")<<endl;
^
test.cpp:45:34: note: candidates are:
test.cpp:14:5: note: int compare(const T&, const T&) [with T = char [6]]
int compare(const T& v1,const T& v2)
^
test.cpp:25:5: note: int compare(const char (&)[N], const char (&)[M]) [with unsigned int N = 6u; unsigned int M = 6u]
int compare(const char(&p1)[N],const char(&p2)[M])
b.为了处理字符串指针 cout<<compare(str1,str2)<<endl;我们特化了 int compare(const T& v1,const T& v2),注意特化的格式以及参数类型。
#include<iostream> #include<cstring> using namespace std; template<typename T> int compare(const T& v1,const T& v2) { if(v1<v2) return -1; if(v2<v1) return 1; return 0; } //Notype template parameter //handle string literals,that type is const char[] template<unsigned N,unsigned M> int compare(const char(&p1)[N],const char(&p2)[M]) { return strcmp(p1,p2); } //special version of compare to handle pointers //to character arrays template<> int compare(const char* const& p1,const char* const& p2) { return strcmp(p1,p2); } int main() { const char* str1="hello"; const char* str2="hello"; cout<<compare(1,2)<<endl; //note:same string length lead to instantiate ambiguously cout<<compare("hello","hell")<<endl; cout<<compare(str1,str2)<<endl; return 0; }
标签:
原文地址:http://www.cnblogs.com/wxquare/p/4743180.html