如何从模板访问模板化类的静态?

Tho*_*ser 2 c++ templates c++11

我正在尝试使用CRTP模式编写模板.我想要的是模板访问static const模板化类中的a.

我的模板在它自己的标题中看起来像这样:

template <class T> foo {
  static const int readValue = T::value
}
Run Code Online (Sandbox Code Playgroud)

我继承了这样的模板(在另一个头文件中):

class fooImpl: foo<fooImpl> {
  static const int value = 42; 
}
Run Code Online (Sandbox Code Playgroud)

然而,clang抱怨说:

'fooImpl'中没有名为'value'的成员

我想我在这里得到了鸡肉和鸡蛋的问题.模板不知道定义fooImpl,因此value在实例化时不能知道它有成员.

但是我该如何解决呢?有没有办法将const值的编译时间传播到实例化模板中?

Jon*_*ely 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;
Run Code Online (Sandbox Code Playgroud)

但是,这不允许您readValue在体内使用编译时常量foo.