我正在尝试模板专门化,但是无法确定无法在下面解析char const * const
的原因(尽管是 valid 类型)。
template <typename A, typename B> B foo (A) = delete;
template <> void foo (char *) {}
template <> void foo (char const * const) {}
int main () {
{ // types OK
char const * const a = nullptr;
char * b = nullptr;
}
char * data;
foo<char *, void>(data); // OK
foo<char const * const, void>(data); // ERROR
return 0;
}
错误
error: use of deleted function ‘B foo(A) [with A = const char* const; B = void]’
答案 0 :(得分:5)
请注意,参数类型将忽略顶级const
限定符,因此
template <> void foo (char const * const) {}
与
相同template <> void foo (char const *) {}
这是foo<char const *, void>
的专用版本,而不是foo<char const * const, void>
(如您所料)。
作为解决方法,您可以使调用和专业化匹配,例如将专业化明确更改为
template <> void foo<char const * const, void> (char const * const) {}
或将调用更改为
foo<char const *, void>(data);