Zia*_*man 3 c++ templates c++03
假设我有一个功能模板StrCompare
template<typename T=NonCaseSenCompare>//NonCaseSenCompare is a user defined class look at the detailed code below.
int StrCompare(char* str1, char* str2)
{
...
}
Run Code Online (Sandbox Code Playgroud)
现在在主要功能我写了一行
char* str1="Zia";
char* str2="zia";
int result=StrCompare(str1,str2);
Run Code Online (Sandbox Code Playgroud)
它应该工作,因为我们提供了一个默认的模板参数,但它
没有
编译器给出以下错误
没有匹配函数调用`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");
}
Run Code Online (Sandbox Code Playgroud)
如果我写
int result=StrCompare<>(ptr1,ptr2);
Run Code Online (Sandbox Code Playgroud)
编译器提供相同的错误消息.
正如gf和AndreyT已经写过的那样,你不能拥有带有函数模板的默认模板参数.但是,如果将比较器转换为函数对象,仍可以使用默认函数参数:
template<typename Comp>
int StrCompare(char* str1, char* str2, Comp = NonCaseSenCompare())
{
...
}
Run Code Online (Sandbox Code Playgroud)
你现在可以StrCompare()像这样打电话
StrCompare("abc","aBc",CaseSenCompare());
Run Code Online (Sandbox Code Playgroud)
或者像这样:
StrCompare("abc","aBc"); // uses NonCaseSenCompare
Run Code Online (Sandbox Code Playgroud)
然后比较器必须如下所示:
struct CaseSenCompare {
bool operator()(char x, char y) const {return x==y;}
};
Run Code Online (Sandbox Code Playgroud)
相应调整StrCompare().
| 归档时间: |
|
| 查看次数: |
2250 次 |
| 最近记录: |