Специализация шаблона функции для указателя - PullRequest
3 голосов
/ 30 апреля 2020

В нашей кодовой базе есть шаблон

template<typename DT>
void f(const DT&) {}

с некоторыми специализациями. Одна из специализаций:

template<>
void f(const int*&) {}

Когда я пытаюсь его использовать, clang дает мне

error: no function template matches function template specialization 'f'
void f(const int*&) {}

note: candidate template ignored: cannot deduce a type for 'DT' that would make 'const DT' equal 'const int *'
void f(const DT&) {}

Пример кода:

template<typename DT>
void f(const DT&) {}

template<>
void f(const int*&) {}

int main() {
    const int *a = nullptr;
    f(a);
}

Почему невозможно специализировать этот шаблон для типа указателя? Как мне получить специализацию?

1 Ответ

6 голосов
/ 30 апреля 2020

Обратите внимание, что в основном шаблоне const квалифицируется для самого типа DT. Предположим, вы хотите специализировать его с типом DT как const int* (т.е. указатель на const int), тогда специализация должна быть

template<>
void f(const int* const&) {} // reference to const (pointer to const int)
//                ^^^^^

Давайте снова проверим основной шаблон, чтобы сравнить и подтвердите тип:

template<typename DT>
void f(const DT&) {} // reference to const (DT)

LIVE

...