我正在研究功能模板。
我尝试了以下代码。
template <typename TYPE>
TYPE& Max(TYPE& a, TYPE& b)
{
return (a > b ? a : b);
}
template < >
char* Max<char*>(char* a, char* b)
{
return (strcmp(a, b) > 0) ? a : b;
}
template < >
const char* Max<const char*>(const char* a, const char* b)
{
return (strcmp(a, b) > 0) ? a : b;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float a = 3.14;
float b = 2.718;
float c = Max(a, b);
char *ca = "abc";
char *cb = "def";
char *cmp = Max(ca, cb); // error (E2015)
}
在C ++ Builder XE4上,我收到了以下错误。
E2015 Ambiguity between 'char *Ma<>(char *, char *) at Unit1.cpp:43'
and 'Max<>(char *,char *)at Unit1.cpp:43'
在这种情况下,我该怎么做才能避免错误2015?
答案 0 :(得分:1)
这段代码非标准,它表明你的编译器已经过时了。
首先,这些专业化是不允许的。主模板提到引用(TYPE &
),因此显式特化也必须使用相同的类型。允许他们更改原始模板的函数体,而不是签名。
在修复之后,它会通过IDEone在线编译器而不会出现更多错误。
#include <string.h>
template <typename TYPE>
TYPE& Max(TYPE& a, TYPE& b)
{
return (a > b ? a : b);
}
template < >
char*& Max<char*&>(char*& a, char*& b)
{
return (strcmp(a, b) > 0) ? a : b;
}
template < >
const char*& Max<const char*>(const char*& a, const char*& b)
{
return (strcmp(a, b) > 0) ? a : b;
}
int main()
{
float a = 3.14;
float b = 2.718;
float c = Max(a, b);
char *ca = "abc";
char *cb = "def";
char *cmp = Max(ca, cb); // no error
}
最好让教师升级,并指出教室编译器和IDEone(或其他在线编译器之间的差异;它们始终可用且始终免费,就像它们的底层软件一样)鼓励。
除编译器和正确性问题外,
非const char *&
业务是多余的。由于函数永远不会修改任何内容,因此您只需为const char
实现它,并允许在指针不是const
时使用它。也许两者都需要,因为专业化的工作原理,但是:
功能专业化几乎总是一个坏主意。例如,您需要const char *
个参数,而不是const char *&
。只需删除下一行的template <>
行和模板参数,您将获得重载。这个程序是一个无关紧要的练习,只是让事情变得艰难。