У меня довольно простой вопрос, я думаю, о CRTP , но я не могу найти ответ на него.Вероятно, потому что это так просто, никто не думал об этом спрашивать.Я новичок в этой концепции, поэтому, пожалуйста, не смейтесь слишком сильно;).
Вот код (это своего рода попытка сделать что-то похожее на контейнеры STL):
template< typename tT >
struct TBase
{
typedef tT T;
};
template< typename tTBase >
struct TTraitsBase
{
typedef typename tTBase::T T;
};
template< typename tTHelpee, typename tTTraits >
struct THelper
{
typedef typename tTTraits::T T;
typedef typename tTHelpee::T Th; /* This generates a compiler error:
'T' not being a member of TDerived<tT> */
T Foo( void )
{
return static_cast< tTHelpee* > ( this )->mVal;
}
};
template< typename tT >
struct TDerived : TBase< tT > , THelper< TDerived< tT > , TTraitsBase< TBase< tT > > >
{
using TBase< tT >::T;
T mVal;
};
int main()
{
TDerived< int >::T lTmp = -1;
TDerived< int > lObj;
lObj.mVal = -1;
std::cout << lObj.Foo() << std::endl;
return 0;
}
Все компилируется, если я комментирую оскорбление typedef typename _THelpee::T Th;
.И это меня смущает: если компилятору не нравится typedef typename _THelpee::T Th;
, почему он пропускает static_cast< _THelpee* > ( this )->mVal
?Я предполагаю, что это как-то связано с неспособностью создать экземпляр THelper
при создании экземпляра TDerived
, но нет ясного понимания.Может ли кто-нибудь дать краткое объяснение и / или некоторые ссылки на то, что здесь происходит?Спасибо.
РЕДАКТИРОВАТЬ: удален префикс _T.