c++ - 这个模板有什么问题

标签 c++

<分区>

我正在做 C++ 第 6 版第 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;
}

最佳答案

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

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

关于c++ - 这个模板有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56381561/

相关文章:

c++ - 从链表中删除节点

c++ - DSO 中的 SIGSEGV,混合 C/C++

c++ - 在 iPhone 上使用开罗?

java - JNI Eclipse 插件

c++ - Qt 造物主 : “XYZ does not name a type”

c++ - 最容易使用连接器/接口(interface)来使用 C++ 的 MySQL/其他数据库

c++ - 错误 : invalid in-class initialization of static data member of non-integral type 'const char[]'

c++ - c++11 新功能,正确使用 shared_ptr?

c++ - 过滤图像 OpenCV 中的植物/杂波

C++/Win32 : How to get the alpha channel from an HBITMAP?