C++ 如何从模板中访问模板化类的静态属性?

C++ 如何从模板中访问模板化类的静态属性?,c++,templates,c++11,C++,Templates,C++11,我正在尝试使用CRTP模式编写模板。我希望模板能够访问模板类中的静态常量 我的模板在其自己的标题中如下所示: template <class T> foo { static const int readValue = T::value } 模板foo{ 静态常量int readValue=T::value } 我从模板继承如下内容(在另一个头文件中): class fooImpl:foo{ 静态常数int值=42; } 然而,clang抱怨说: 在'fooImpl'中没有名

我正在尝试使用CRTP模式编写模板。我希望模板能够访问模板类中的
静态常量

我的模板在其自己的标题中如下所示:

template <class T> foo {
  static const int readValue = T::value
}
模板foo{
静态常量int readValue=T::value
}
我从模板继承如下内容(在另一个头文件中):

class fooImpl:foo{
静态常数int值=42;
}
然而,clang抱怨说:

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

我想我遇到了鸡和蛋的问题。模板不知道
fooImpl
的定义,因此在实例化时无法知道它是否具有成员

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

基类在基类列表中实例化,但是
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;
模板结构foo{
静态常量int readValue;
};
类fooImpl:foo{
静态常数int值=42;
};
模板常量int foo::readValue=T::value;

但是,这将不允许您在
foo

的主体中使用
readValue
作为编译时常量,除非foo和fooImpl是同一个文件,否则这将不起作用,对吗?您可以将它们保存在单独的标题中。
readValue
的类外定义不需要在
fooImpl
的定义之后,只需要在类外定义即可。但是,如果不仔细管理显式实例化,就不能将类外定义放在非头文件中。我目前的解决方案是使用第三个“helper类”fooConsts,它包含我通常放在fooImpl中的常量。然后,我可以控制何时声明foocont(在模板和fooImpl之前),并且两者都可以看到然后再看到const。非常难看,但我想这是一种仍然认为头文件是一个好主意的语言促使您这么做的原因。
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;