首页 > 解决方案 > 这个模板有什么问题

问题描述

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

#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;
}

标签: c++

解决方案


您应该简单地开始使用调试器,或者至少可以使用 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;
}

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


推荐阅读