Вложенная специализация шаблона приводит к «Незаконному использованию явных аргументов шаблона»? - PullRequest
5 голосов
/ 24 марта 2012

Как мне специализировать вложенный шаблон? (См. Ошибку ниже.)

using std::reverse_iterator;

template<typename It>
reverse_iterator<It> make_reverse_iterator(const It &it)
{
    return reverse_iterator<It>(it);
}

template<typename It>
It make_reverse_iterator<reverse_iterator<It> >(const reverse_iterator<It> &it)
{
    // Above                     ^
    // error C2768:
    //   'make_reverse_iterator': illegal use of explicit template arguments
    return it.base();
}

Ответы [ 2 ]

6 голосов
/ 24 марта 2012

Это частичная специализация шаблона функции. Это не разрешено.

В этом примере проблему можно решить с помощью перегрузки:

template<typename It>
It make_reverse_iterator(const reverse_iterator<It> &it)
{
    return it.base();
}

В случаях, когда перегрузки не работают, вы можете прибегнуть к частичной специализации шаблонов классов.

4 голосов
/ 24 марта 2012

Это частичная специализация шаблона частичной функции , что недопустимо.Однако вы можете добиться того же эффекта, перегрузив функцию:

template<typename It>
It make_reverse_iterator(const reverse_iterator<It> &it)
{
    return it.base();
}

Выше приведена не специализация шаблона, а перегрузка шаблона make_reverse_iterator, где параметр равен const_reverse_iterator<It>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...