这个模板怎么了

时间:2019-05-30 15:50:14

标签: c++

我正在做c ++第六版第八章第六练习。我对此模板有疑问。我不知道为什么它总是显示最后一个字符串而不显示最大长度的字符串。

#include <iostream>
#include <cstring>

//8.6

using namespace std;

template <typename T> T Maxn(T *,int);

template <>  char * Maxn<>(char **,int );

int main()
{
    double arr_1[5] = { 0.0,3.0,1.0,4.0,5.0 };
    cout << "double max: " << Maxn(arr_1,5) << endl;

    int arr_2[4] = { 3,4,1,0 };
    cout << "int max: " << Maxn(arr_2, 4) << endl;

    const char *arr_3[4] = { "sdf","tttq","ttttrrsdss" ,"q12221"};  
    cout << "char max:" << Maxn(arr_3, 4) << endl;

    return 0;
}

template <typename T>
T Maxn(T *p,int n)
{
    T max = p[0];
    for (int i = 0; i < n; i++)
    {
        if (p[i] > max)
            max = p[i];
    }

    return max;
}

template <> char * Maxn<>(char **p, int n)
{
    char * max = p[0];
    for (int i = 0; i < n; i++)
    {
        if (strlen(p[i]) > strlen(max))
        {
            max = p[i];
        }
    }
    return max;
}

2 个答案:

答案 0 :(得分:1)

您应该只是开始使用调试器,或者至少可以使用printf调试来访问代码。您会发现,从未使用过char*专业化功能!

原因:

您的“字符串”数据类型为const char*,它比第一个模板更适合第一个模板,而不适合您的专业化,因此只需调用第一个模板版本。现在,这将比较字符串的地址。如果您的编译器按照源代码中显示的顺序放置字符串,则始终会看到最后一个字符串,因为它的地址最高。

只需使用:

template <> const char * Maxn<>(const char **p, int n)
{
    const char * max = p[0];
    for (int i = 0; i < n; i++)
    {
        if (strlen(p[i]) > strlen(max))
        {
            max = p[i];
        }
    }
    return max;
}

顺便说一句:您的代码有一些效率流程。在第一步中,您将不需要的相同值进行了两次比较。

答案 1 :(得分:0)

arr_3的类型为const char *,但不是char *

const char *arr_3[4] = { "sdf","tttq","ttttrrsdss" ,"q12221"};  

,因此调用Maxn的第一个实现,其中不使用strlen