我正在尝试使用CRTP模式编写模板。我想要的是模板访问模板化类中的static const
。
我的模板在其标题中看起来像这样:
template <class T> foo {
static const int readValue = T::value
}
我继承了这样的模板(在另一个头文件中):
class fooImpl: foo<fooImpl> {
static const int value = 42;
}
但是,clang抱怨道:
没有名为&#39; value&#39;在&#39; fooImpl&#39;
我想我在这里得到了鸡和蛋的问题。模板不知道fooImpl
的定义,因此,在实例化时无法知道它具有成员value
。
但我该如何解决呢?有没有办法将const值的编译时间传播到实例化模板中?
答案 0 :(得分:6)
foo<fooImpl>
基类在基类列表中实例化,但此时fooImpl
是一个不完整的类型,foo::value
尚未声明。
您可以稍后移动静态成员的定义:
template <class T> struct foo {
static const int readValue;
};
class fooImpl: foo<fooImpl> {
static const int value = 42;
};
template<class T> const int foo<T>::readValue = T::value;
但是,这不允许您在readValue
的正文中使用foo
作为编译时常量。