О шаблонах и специализациях
От: achp  
Дата: 27.06.02 14:11
Оценка: 5 (1)
Маленький и очень скромный шаблон:

template< class Delegate, class Arg, class Result >
class closure_t :
    public std::unary_function< Arg, Result >
{
private:
    Delegate& _d;
    Result (Delegate::*_f)(Arg);

public:
    explicit closure_t(Delegate& d, Result (Delegate::*f)(Arg)) :
        _d(d), _f(f)
    {}

    Result operator()(Arg x) const
    { 
        return (_d.*_f)(x);
    }
};


... со вспомогательной функцией:

template< class Delegate, class Arg, class Result >
closure_t< Delegate, Arg, Result > closure(Delegate& d, Result (Delegate::*f)(Arg))
{
    return closure_t< Delegate, Arg, Result >(d, f);
}


При попытке использования при Result = void, компилятор (MSVC++ 6.0) ругается на return в closure_t::operator()().

В связи с этим, Вопрос 1: Он правильно ругается? Ведь (_d._f)(x) имеет тип void, и, как мне раньше казалось, такая конструкция допустима. И как тогда работают std::mem_fun_t и прочие, если тип адаптируемой функции void?

Далее, пытаясь обойти сие, тщусь написать специализацию:

template< class Delegate, class Arg >
class closure_t< Delegate, Arg, void > :
    public std::unary_function< Arg, void >
{
private:
    Delegate& _d;
    void (Delegate::*_f)(Arg);

public:
    explicit closure_t(Delegate& d, void (Delegate::*f)(Arg)) :
        _d(d), _f(f)
    {}

    void operator()(Arg x) const
    { 
        (_d.*_f)(x);
    }
};


Компилятор мне на это отвечает:

error C2989: 'closure_t<Delegate,Arg,void>' : template class has already been defined as a non-template class
error C2988: unrecognizable template declaration/definition



Вопрос 2: Что не так в этой специализации?

PS: К сожалению, образцов типа boost под рукою нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.