0

简介:我想显式地显示最长的字符串,我以为是“Carmelo Anthony”,结果是“Jordan”。我知道使用通用模板版本而不是显式模板版本。所以它只是比较点的值(地址值),对吧?但是我怎么能看到“卡梅罗·安东尼”呢?感谢您回答我的第一篇文章!

#include <iostream>
#include <cstring>     //for strlen()

template <class T>     //general template
T maxn (T arr[], int n);
template <> char * maxn<char *>(char * arr[], int n);    //explicit specialization

int main()
{
    using namespace std;
    int intArr[6] = {1, 2, 34, 6, 9, 10};
    double douArr[4] = {2.34, 90.6, -83.872, -0.23};
    const char * arr[5] = 
    {
        "Hello World",
        "Kobe Bryant",
        "Lebron James",
        "Carmelo Anthony",
        "Jordan"            
    };
    std::cout << maxn (intArr, 6) << std::endl;
    std::cout << maxn (douArr, 4) << std::endl;
    std::cout << maxn (arr, 5) << std::endl;
    return 0;
}

template <class T>
T maxn (T arr[], int n)
{
    T maxValue =  arr[0];
    for (int i = 1; i < n; i++)
    {
        maxValue = maxValue > arr[i] ? maxValue:arr[i];
    }
    return maxValue;
}

template <> char * maxn<char *>(char * arr[], int n)
{
    char * p= arr[0];   //pointer p points to the present longest string
    for (int i = 1; i < n; i++)
    {
        p = strlen (arr[i]) > strlen (p) ? arr[i] : p;
    }
    return p;
}
4

2 回答 2

1

正如@PaulMcKenzie 所建议的那样,问题在于缺少const. 更详细一点,您的模板特化是针对指向 non- const(即 mutable)的指针数组char。这告诉编译器您可能会更改正在传入的字符串。但是,您传入一个数组const char *,即不可变字符串。编译器不会让您调用可能会改变数据const数据的函数,因此除非您添加const.

于 2014-09-04T02:15:53.910 回答
0

作为对上一个答案的补充,您可以通过提供两个版本都将调用的简单辅助函数来专门const char *char *两者:

#include <iostream>
#include <cstring>     //for strlen()

template <class T>     //general template
T maxn(T arr[], int n);
template <> const char * maxn<const char *>(const char * arr[], int n);    //explicit specialization
template <> char * maxn<char *>(char * arr[], int n);

int main()
{
    using namespace std;
    int intArr[6] = { 1, 2, 34, 6, 9, 10 };
    double douArr[4] = { 2.34, 90.6, -83.872, -0.23 };
    const char * arr[5] =
    {
        "Hello World",
        "Kobe Bryant",
        "Lebron James",
        "Carmelo Anthony",
        "Jordan"
    };

    char * arr2[5];
    for (int i = 0; i < 5; ++i)
    {
        arr2[i] = new char[strlen(arr[i]) + 1];
        strcpy(arr2[i], arr[i]);
    }

    std::cout << maxn(intArr, 6) << std::endl;
    std::cout << maxn(douArr, 4) << std::endl;
    std::cout << maxn(arr, 5) << std::endl;
    std::cout << maxn(arr2, 5) << std::endl;
    return 0;
}

template <class T>
T maxn(T arr[], int n)
{
    T maxValue = arr[0];
    for (int i = 1; i < n; i++)
    {
        maxValue = maxValue > arr[i] ? maxValue : arr[i];
    }
    return maxValue;
}

template<typename T> 
T* charHelper(T *arr[], int n)
{
    T* p = arr[0];
    for (int i = 1; i < n; i++)
    {
        p = strlen(arr[i]) > strlen(p) ? arr[i] : p;
    }
    return p;
}

template <> char * maxn<char *>(char * arr[], int n)
{ return charHelper<char>(arr, n); }

template <> const char * maxn<const char *>(const char * arr[], int n)
{ return charHelper<const char>(arr, n); }

输出:

34
90.6
Carmelo Anthony
Carmelo Anthony

main暂时忽略函数中 明显的内存泄漏。

请注意,对于arr版本,const char*调用专业化,而对于arr2版本,char *调用版本。

于 2014-09-04T03:56:52.417 回答