Шаблон Специализация шаблона - PullRequest
2 голосов
/ 30 июня 2011

ОК, у меня есть:

template<typename T>
class Reader
{
    class Input
    {
        template<typename C>
        void operator()(C& val) const
        {
            /* Do Some Work */
        }
    };
};

К сожалению, универсальная версия "Do Some Work" не работает для меня. Также его нелегко изменить, потому что он находится в середине какого-то тяжелого шаблона мета-программирования.

Так что, хотя я мог бы специализировать метод для своего типа. Поэтому я первым делом попытался вытащить общий метод из класса.

template<typename T>
class Reader
{
    class Input
    {
        template<typename C>
        void operator()(C& val) const;
    };
};


template<typename T>
template<typename C>
void typename Reader<T>::Input template operator()<C>(C& val) const   // LINE 13
{
    /* Do Some Work */
}

К сожалению, я получаю ошибку:

s.h: 13: ошибка: ошибка: ожидается ‘)’ перед символом ‘&’

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Просто напишите, как обычно

template<typename T>
template<typename C>
void Reader<T>::Input::operator()(C& val) const   // LINE 13
{
    /* Do Some Work */
}

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

0 голосов
/ 09 августа 2013

Полагаю, это невозможно, поскольку это считается частичной специализацией шаблона функции, что недопустимо. void Reader<T>::Input::operator () (C& int) имеет неявный первый аргумент (указатель this) типа Reader<T>::Input *, следовательно, его подпись фактически void (Reader<T>::Input *, C &). Вы пытаетесь указать C, но не T.

...