显式特化:语法错误?

时间:2015-11-22 22:20:18

标签: c++ function templates specialization

我正在编写一个程序,该程序需要一个具有项目数组的模板函数,以及该数组中作为参数的项目数。该函数需要返回所述数组中的最大项。如果输入了一个字符串数组,程序还应该有一个特殊化(我遇到问题),它会检查数组中最长的字符串。

以下是我的原型:

template <typename T>
T compare(T const arr1[], int n);

template <> const char *compare<const char *>(const char *const arr2[][3], int n);

主程序..

int main()
{
    int a[7] = { 3, 67, 100, 91, 56, 67, 83 };
    double b[] = { 2.5, 2.6102, 2.61, 1.03 };
    //char* c[3] = { "see if this works", "functions", "explicit specialization" };
    char c0[30] = { "see if this works" };
    char c1[30] = { "functions" };
    char c2[30] = { "explicit specialization" };
    char *d[][3] = { c0, c1, c2 };

    cout << "Comparing int values: " << endl;
    cout << "Largest int value is: " << compare(a, 7) << endl;
    cout << "Comparing double values: " << endl;
    cout << "Largest double value is: " << compare(b, 4) << endl;

    return 0;
}

功能定义......

template <typename T>
T compare(T const arr1[], int n) {
    T temp;
........
    return temp;
}

template <> const char *compare<const char *>(const char *const arr2[][3], int n); {
    const char *temp2 = &arr2[0];
    return *temp2;
}

我写了一些虚拟代码来测试第二个函数是否有效但它没有返回正确的值(它返回&#39;显式特化&#39;)有人可以指出我有什么问题吗?语法?

1 个答案:

答案 0 :(得分:1)

如上所述,过载比专业化更适合这个问题:

const char *compare(const char *const arr2[], int n);

请注意,虽然我将方括号放入参数类型以匹配模板,但此声明等同于const char *const *arr2的声明,因为函数参数在这方面是特殊的。

假设您出于任何原因绝对需要专业化(虽然解释也适用于上述解决方案):

考虑T是什么以及您的专业化是什么。 T是序列的元素类型,您已将T=char的模板专门化。这意味着您已经将模板专门用于字符序列,而不是字符串序列。

要专门处理一系列C字符串,请将const char *替换为T而不是char

template <> const char *compare<const char *>(const char *const arr2[], int n);