c中的默认模板参数
发布时间:2020-12-16 10:16:23 所属栏目:百科 来源:网络整理
导读:假设我有一个功能模板StrCompare templatetypename T=NonCaseSenCompare//NonCaseSenCompare is a user defined class look at the detailed code below.int StrCompare(char* str1,char* str2){...} 现在在主要功能我写了一行 char* str1="Zia";char* str2=
假设我有一个功能模板StrCompare
template<typename T=NonCaseSenCompare>//NonCaseSenCompare is a user defined class look at the detailed code below. int StrCompare(char* str1,char* str2) { ... } 现在在主要功能我写了一行 char* str1="Zia"; char* str2="zia"; int result=StrCompare(str1,str2); 它应该工作,因为我们提供了一个默认的模板参数,但它没有编译器给出以下错误 #include<iostream.h> class CaseSenCompare { public: static int isEqual(char x,char y) { return x==y; } }; class NonCaseSenCompare { public: static int isEqual(char x,char y) { char char1=toupper(x); char char2=toupper(y); return char1==char2; } }; template<typename T=NonCaseSenCompare> int StrCompare(char* str1,char* str2) { for(int i=0;i < strlen(str1)&& strlen(str2);i++) { if(!T::isEqual(str1[i],str2[i])) return str1[i]-str2[i]; } return strlen(str1)-strlen(str2); } main() { char* ptr1="Zia ur Rahman"; char* ptr2="zia ur Rahman"; int result=StrCompare(ptr1,ptr2);//compiler gives error on this line cout<<result<<endl; system("pause"); } 如果我写 int result=StrCompare<>(ptr1,ptr2); 编译器提供相同的错误消息. 解决方法
正如
gf和
AndreyT已经写过的那样,你不能拥有带有函数模板的默认模板参数.但是,如果将比较器转换为函数对象,仍可以使用默认函数参数:
template<typename Comp> int StrCompare(char* str1,char* str2,Comp = NonCaseSenCompare()) { ... } 您现在可以像这样调用StrCompare() StrCompare("abc","aBc",CaseSenCompare()); 或者像这样: StrCompare("abc","aBc"); // uses NonCaseSenCompare 然后比较器必须如下所示: struct CaseSenCompare { bool operator()(char x,char y) const {return x==y;} }; 相应地调整StrCompare(). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |