error: non-static data member ‘value’ declared ‘constexpr’
ttt.cc:6:24: error: non-static data member ‘value’ declared ‘constexpr’ constexpr int value=a+b; ^ ttt.cc: In function ‘int main()’: ttt.cc:14:30: error: invalid use of non-static data member ‘Add_<2, 3>::value’ constexpr int x1=Add_<2,3>::value; ^~~~~ ttt.cc:6:24: note: declared here constexpr int value=a+b;
源码
#include <iostream> using namespace std; template<int a,int b> struct Add_{ constexpr int value=a+b; }; template<int a,int b> constexpr int Add=a+b; int main(void) { constexpr int x1=Add_<2,3>::value; cout<<"template 1: "<<x1<<endl; constexpr int x2=Add<3,4>; cout<<"template 2: "<<x2<<endl; return 0; }
constexpr int value改成constexpr static int value就可以了
因为类的非静态成员是在类被实例化之后才被创建出来。也就是说当程序运行起来,创建这个类的时候,这个类里面的非静态成员才会被初始化。而constexpr关键字表明函数在编译期就被调用,变量在编译期就得到明确结果,所以constexpr只能修饰于类的静态成员。
所以要在类中声明元函数,一定要限定成静态类型成员。
无情的摸鱼机器