加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);

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

#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().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读