gpt4 book ai didi

c++ - C++中的默认模板参数

转载 作者:太空狗 更新时间:2023-10-29 19:47:18 25 4
gpt4 key购买 nike

假设我有一个函数模板 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);

编译器给出相同的错误信息。

最佳答案

作为gfAndreyT已经写过,函数模板不能有默认模板参数。但是,如果将比较器转换为函数对象,您仍然可以使用默认函数参数:

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

关于c++ - C++中的默认模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2328408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com