複数のクラスがあり、バインディング手段が必要なので、シンプルな形式のCRTP(Curiously Recurring Template Pattern)を使用しようとしています。一緒に(例えば私はWidget、Doobry、WhatsitのようなクラスをWidgetHandle、DoobryHandle、WhatsitHandleといった関連クラスと一緒に持っています)。依存型を持つ単純なCRTPの場合のコンパイルエラー
私がBase
から継承するために使用している各クラスは typedefを追加しており、基本クラスでtypename TWrapper::value_type
と参照できるようになっています。
struct WidgetHandle {};
template <typename TWrapper>
class Base
{
public:
Base(typename TWrapper::value_type value_)
: value(value_) {}
typename TWrapper::value_type value;
};
class Widget : public Base<Widget>
{
public:
typedef WidgetHandle value_type;
Widget(WidgetHandle value_) : Base<Widget>(value_) {}
};
int main(int argc, char* argv[])
{
Widget i(WidgetHandle());
return 0;
}
しかし、私はコンパイルエラーを取得しています:
scratch1.cpp(10): error C2039: 'value_type' : is not a member of 'Widget'
scratch1.cpp(16) : see declaration of 'Widget'
scratch1.cpp : see reference to class template instantiation 'Base<TWrapper>' being compiled
1> with
1> [
1> TWrapper=Widget
1> ]
scratch1.cpp(10): error C2039: 'value_type' : is not a member of 'Widget'
私が打ち鳴らすと同様のエラーを取得していますが、これは、VS2010です。私はここで何が欠けていますか?
'Widget'は' Base'へのパラメータとして渡すと完全ではありません。 – jrok
実際には、どこにでもvalue_typeが定義されていません。 – lapk
@PetrBudnikウィジェット本体の先頭です。 – jrok