0

我现在正在研究函数模板。

我尝试了以下代码。

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?

4

1 回答 1

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. 非常量char *&业务是多余的。由于该函数从不修改任何内容,因此您可以实现它const char并允许在指针不是时使用它const。由于专业化的工作方式,可能两者都需要,但是:

  2. 函数专业化几乎总是一个坏主意。例如,您需要const char *此处的参数,而不是const char *&. 只需删除该template <>行和下一行的模板参数,您就会得到一个重载。这个程序是一个无关模板的练习,它只会无缘无故地让事情变得困难。

于 2013-09-24T00:56:35.543 回答