为什么我不能调用以下代码的C++显式专用化版本?



简介:我希望显式的深褐色显示最长的字符串,我以为是"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;
}

正如@PaulMcKenzie所建议的,问题在于缺少const。更详细地说,您的模板专门化是针对指向非const(即可变)char的指针数组。这告诉编译器,您可以更改传入的字符串。但是,您传入一个const char *数组,即不可变的字符串。编译器不允许您调用可能使const数据上的数据发生突变的函数,因此除非您添加const,否则它不会使用您的专用化。

作为上一个答案的补充,您可以通过提供一个简单的助手函数来专门化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 *版本。

相关内容

  • 没有找到相关文章

最新更新