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

dec*_*iar 4 c++ templates template-specialization

我正在尝试模板专门化,但是无法确定以下原因char const * const(尽管是有效类型)无法解析的原因。

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;
}
Run Code Online (Sandbox Code Playgroud)

错误

error: use of deleted function ‘B foo(A) [with A = const char* const; B = void]’
Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

请注意,const参数类型将忽略顶级限定符,因此,

template <> void foo (char const * const) {}
Run Code Online (Sandbox Code Playgroud)

与...相同

template <> void foo (char const *) {}
Run Code Online (Sandbox Code Playgroud)

这是的专用版本foo<char const *, void>,而不是foo<char const * const, void>(如您预期的那样)。

解决方法是使调用和专业化匹配,例如,将专业化明确更改为

template <> void foo<char const * const, void> (char const * const) {}
Run Code Online (Sandbox Code Playgroud)

或将调用更改为

foo<char const *, void>(data);
Run Code Online (Sandbox Code Playgroud)

  • @lubgr这仅对实现有意义,即,无法在函数内部更改const参数。但是从调用方的角度来看,这没有任何区别。参数被复制到参数,调用者不在乎它是否是const。因此,我们不能同时定义两个函数,例如`void foo(int);`和`void foo(const int)`。它们被认为是相同的签名。 (2认同)