Ошибка: использование удаленной функции для перегруженного шаблона - PullRequest
4 голосов
/ 26 марта 2019

Я пытаюсь специализироваться на шаблонах, но не могу определить причину, по которой 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;
}

Ошибка

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

1 Ответ

5 голосов
/ 26 марта 2019

Обратите внимание, что квалификатор верхнего уровня 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);
...