C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c中的默认模板参数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个功能模板StrCompare @H_801_5@ @H_801_5@
template<typename T=NonCaseSenCompare>//NonCaseSenCompare is a user defined class look at the detailed code below.
int StrCompare(char* str1,char* str2)
{
...
}
@H_801_5@现在在主要功能我写了一行

@H_801_5@
char* str1="Zia";
char* str2="zia";
int result=StrCompare(str1,str2);
@H_801_5@它应该工作,因为我们提供了一个认的模板参数,但它没有编译器给出以下错误
没有匹配函数调用`StrCompare(char *&,char *&)’
现在详细的代码由.给出

@H_801_5@
#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");
}
@H_801_5@如果我写

@H_801_5@
int result=StrCompare<>(ptr1,ptr2);
@H_801_5@编译器提供相同的错误消息.

解决方法

正如 gfAndreyT已经写过的那样,你不能拥有带有函数模板的认模板参数.但是,如果将比较器转换为函数对象,仍可以使用函数参数: @H_801_5@ @H_801_5@
template<typename Comp>
int StrCompare(char* str1,char* str2,Comp = NonCaseSenCompare())
{
  ...
}
@H_801_5@您现在可以像这样调用StrCompare()

@H_801_5@
StrCompare("abc","aBc",CaseSenCompare());
@H_801_5@或者像这样:

@H_801_5@
StrCompare("abc","aBc"); // uses NonCaseSenCompare
@H_801_5@然后比较器必须如下所示:

@H_801_5@
struct CaseSenCompare {
  bool operator()(char x,char y) const {return x==y;}
};
@H_801_5@相应地调整StrCompare().

大佬总结

以上是大佬教程为你收集整理的c中的默认模板参数全部内容,希望文章能够帮你解决c中的默认模板参数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。