Re: Шаблоны, швблоны, шаблоны ....
От: _Dreamer Россия  
Дата: 13.02.07 06:08
Оценка:
Здравствуйте, _INDY_, Вы писали:

_IN>Уважаемый ALL, прошу ответа:


_IN>
_IN> template <typename _TGTCLS_T>
_IN> HRESULT SetStreamInitializationCallback(_TGTCLS_T *pCls, HRESULT (_TGTCLS_T::*pVideoCbck)(void), HRESULT (_TGTCLS_T::*pAudioCbck)(void)){
_IN>     return NOERROR;
_IN> }
_IN>

_IN>работает.

_IN>
_IN> template <typename _TGTCLS_T, typename HRESULT (_TGTCLS_T::*_CALLBACK_T)(void)>
_IN> HRESULT SetStreamInitializationCallback(_TGTCLS_T *pCls, _CALLBACK_T pVideoCbck, _CALLBACK_T pAudioCbck){ 
_IN>// здесь ругается на _CALLBACK_T (error C2061: syntax error : identifier '_CALLBACK_T')
_IN>     return NOERROR;
_IN> }
_IN>

_IN>не работает ...

_IN>в чём может быть загвоздка?


ну правильно.
по сути тут нужен typedef, тоесть вот такое
template < typename _TGTCLS_T >
struct helper
{
  typedef typename HRESULT (_TGTCLS_T::*_CALLBACK_T)(void);
};

template < typename _TGTCLS_T >
HRESULT SetStreamInitializationCallback(_TGTCLS_T *pCls, typename helper<_TGTCLS_T>::_CALLBACK_T pVideoCbck, typename helper<_TGTCLS_T>::_CALLBACK_T pAudioCbck){ 
     return NOERROR;
}


либо вообще так —
template <typename _TGTCLS_T, HRESULT (_TGTCLS_T::*_VIDEO_CALLBACK_T)(void), HRESULT (_TGTCLS_T::*_AUDIO_CALLBACK_T)(void) >
HRESULT SetStreamInitializationCallback(_TGTCLS_T *pCls, _CALLBACK_T pVideoCbck, _CALLBACK_T pAudioCbck){ 
     return NOERROR;
}

struct foo
{
    HRESULT bar1() {return NOERROR;}
    HRESULT bar2() {return NOERROR;}
};

SetStreamInitializationCallback< foo, &foo::bar1, &foo::bar2 >( pFoo );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.