错误:对重载模板使用删除的功能

时间:2019-03-26 09:17:35

标签: c++ templates template-specialization

我正在尝试模板专门化,但是无法确定无法在下面解析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]’

1 个答案:

答案 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);