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' プレフィックスを削除しました。