有这样的模式。
template<class T>
T maxn(T *, int);
和专业化char*
template<> char* maxn(char**, int);
现在我还想添加const,即 T maxn(const T *, int);,但是在将其添加到 specialization 之后const,会引发错误,即 maxn红色下划线。
template<> char* maxn<char*>(const char**, int);
为什么?谁来解释?
模板特化必须匹配它特化的主模板。
首先,您在 specialization 中明确指定了模板参数
T == char *。但是您的第一个专业化已经为此参数值完成T。不可能对同一组参数值进行另一种特化。(如果你在第一次特化中没有这样做,为什么突然决定显式指定参数的值?)其次,
T == char *从模板参数的值立即得出函数参数T *的类型必须是char **。你写了 -const char **。这已经与主要模式相矛盾。第三,在您的主模板中清楚地写着返回值的类型与函数参数的类型(
T和T *分别)相关联。这意味着如果参数类型是const char **,则返回值不能是char *。这也违背了主要模式。换句话说,你的主模板不可能有这样的专业化。
这就是你的专长
但不是你现在拥有的。
然后这一切都取决于你想要做什么。从您的问题中不清楚为什么需要这种“专业化”。也许您需要重载,而不是专业化?
或者
好吧,在这里没有收到完整的答案,我决定在英语 StackOverflow 中问同样的问题。他们回答了我
这是答案的链接。