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只能修饰于类的静态成员。

所以要在类中声明元函数,一定要限定成静态类型成员。

posted @ 2021-07-12 11:36  Wangtn  阅读(818)  评论(0编辑  收藏  举报