我正在尝试为函数编写模板特化,该函数返回数值数组(通用版本)的最大值或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'与任何模板声明都不匹配。
我哪里错了?
答案 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指针的指针。