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

时间:2015-02-20 15:21:39

标签: c++ templates c++11

我正在尝试使用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值的编译时间传播到实例化模板中?

1 个答案:

答案 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作为编译时常量。