功能模板的区别

时间:2013-09-24 00:16:55

标签: c++ c++builder c++builder-xe4

我正在研究功能模板。

我尝试了以下代码。

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?

1 个答案:

答案 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
}

http://ideone.com/gR9VFX

最好让教师升级,并指出教室编译器和IDEone(或其他在线编译器之间的差异;它们始终可用且始终免费,就像它们的底层软件一样)鼓励。

除编译器和正确性问题外,

  1. 非const char *&业务是多余的。由于函数永远不会修改任何内容,因此您只需为const char实现它,并允许在指针不是const时使用它。也许两者都需要,因为专业化的工作原理,但是:

  2. 功能专业化几乎总是一个坏主意。例如,您需要const char *个参数,而不是const char *&。只需删除下一行的template <>行和模板参数,您将获得重载。这个程序是一个无关紧要的练习,只是让事情变得艰难。