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

标签 c++ templates explicit-specialization

<分区>

简介:我想显式sepiaclization显示最长的字符串,我以为是“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

关于c++ - 为什么我不能调用以下代码的 C++ 显式特化版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25656158/

相关文章:

c++ - 为什么从 std::istream 读取记录结构字段失败,我该如何解决?

c++ - 将函数传递给方法原型(prototype)

javascript - 在 jQuery 中处理 JSON 和 HTML 模板

c++ - 为什么我在静态库中缺少显式模板特化的符号?

c++ - 名称查找 : downsides to using unqualified class name inside a class definition/omitting template parameters?

c++ - .h 文件存在问题,它似乎没有正确链接

c++ - 读取 SGX 飞地中的文件内容

android - 如何绘制/渲染 Bullet Physics 碰撞体/形状?

c++ - typedef 模板声明的替代方法