我正在尝试使用一种简单形式的 CRTP(Curiously Recurring Template Pattern),因为我有几个类,每个类都有几个相关的类,我想要一种将它们绑定在一起的方法(例如,我有像 Widget 这样的类, Doobry 和 Whatsit,以及相关的类 WidgetHandle、DoobryHandle 和 WhatsitHandle)。
我用来继承的每个类都Base
添加了一个value_type
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,虽然我在clang中遇到了类似的错误。我在这里想念什么?