使用const char **和Template Specialization

时间:2014-05-09 13:35:39

标签: c++ templates const template-specialization specialization

我正在尝试为函数编写模板特化,该函数返回数值数组(通用版本)的最大值或c字符串数组(特化)的最长c字符串。如果我不使用const-ness,我的函数原型看起来像这样

template <typename T>
T maxn(T* my_Tptr, unsigned int n);

template <>
char* maxn <char*> (char** my_cstrings, unsigned int n);

我的代码编译。

但是,如果我尝试使用const-ness,我的函数原型看起来像这样,

template <typename T>
T maxn(const T* my_Tptr, unsigned int n);

template <>
char* maxn <char*> (const char** my_cstrings, unsigned int n);

我的代码无法编译,编译器(gcc)会输出此错误:

错误:'char * maxn(const char **,unsigned int)'的template-id'maxn'与任何模板声明都不匹配。

我哪里错了?

4 个答案:

答案 0 :(得分:2)

问题在于const。仔细观察const T* my_Tptr意味着 my_Tptr是指向const T 的指针。但const char** my_Tptr表示 Tptr是指向const char 的指针。因此类型从指针移动到const T 指针指向const T 。如果你使它char* const* my_Tptr*然后它将工作,从那时类型将是指向const char指针的指针。专门化是指向const T *的指针 - &gt;指向const char *

的指针

答案 1 :(得分:1)

不确定它背后的整个逻辑是什么,但如果你改变你的模板定义,说你期望指针有帮助:

template <typename T>
T* maxn(const T** my_Tptr, unsigned int n);

template <>
char* maxn(const char** my_cstrings, unsigned int n);

答案 2 :(得分:0)

您可能会为char-case提供几个重载来解决问题:

#include <iostream>
#include <stdexcept>

template <typename T>
T maxn(const T* const data, unsigned int n) {
    throw std::logic_error("Failure");
}

const char* maxn(const char * const * data, unsigned int n) {
    return "Success";
}

inline const char* maxn(const char** data, unsigned int n) {
    return maxn(static_cast<const char * const *>(data), n);
}

inline const char* maxn(char* const * data, unsigned int n) {
    return maxn(static_cast<const char * const *>(data), n);
}

inline const char* maxn(char** data, unsigned int n) {
    return maxn(static_cast<const char * const *>(data), n);
}

int main() {
    const char* a[] = { "A", "B", "C" };
    std::cout << maxn((const char * const *)a, 3) << '\n';
    std::cout << maxn((const char **)a, 3) << '\n';
    std::cout << maxn((char * const *)a, 3) << '\n';
    std::cout << maxn((char**)a, 3) << '\n';
}

答案 3 :(得分:-1)

编译好:

template <>
char* maxn(char* const* my_cstrings, unsigned int n);

它接受指向基本模板中指定的const char指针的指针。