C++ 使用类模板';s static constexpr作为模板参数

C++ 使用类模板';s static constexpr作为模板参数,c++,templates,C++,Templates,我有一个基类,它包含一个模板大小的缓冲区。然后创建具有特定大小的子类。大小都应该是相同数字的倍数。我想我会在基类中将该数字设为constexpr,但编译器不会接受constexpr作为模板参数。下面是一些示例代码: template<int buf_size> class A { public: static constexpr int basic_size = 256; protected: int buf[buf_size]; };

我有一个基类,它包含一个模板大小的缓冲区。然后创建具有特定大小的子类。大小都应该是相同数字的倍数。我想我会在基类中将该数字设为constexpr,但编译器不会接受constexpr作为模板参数。下面是一些示例代码:

template<int buf_size> class A
{
    public:
        static constexpr int basic_size = 256;
    protected:
        int buf[buf_size];
};

class B : A<2 * A::basic_size>
{
    public:
        void other_stuff();
};
模板类别A
{
公众:
静态constexpr int basic_size=256;
受保护的:
int buf[buf_size];
};
B类:A
{
公众:
使其他东西无效;
};
但是编译器告诉我“模板参数1无效”。我尝试在A之后添加,但没有帮助:

class B : A<2 * A<>::basic_size>   //Same error
B类:A//相同错误
看起来我必须提供一个实际数字作为模板参数:

class B : A<2 * A<0>::basic_size>  //Works!
B类:A//有效!
不过这很难看。我是C++新手。有更好的方法吗?我正在为微控制器编写代码,所以我需要在编译时静态分配缓冲区——因此需要模板

大小都应该是相同数字的倍数

如果这是您的意图,则说明您没有正确使用发布代码中的数字。我建议:

template<unsigned int Multiplier=1> class A
{
    public:
        static constexpr int basic_size = 256;
    protected:
        int buf[buf_size*Multiplier];
};

class B : A<2>
{
    public:
        void other_stuff();
};
模板类别A
{
公众:
静态constexpr int basic_size=256;
受保护的:
int buf[buf_size*乘数];
};
B类:A
{
公众:
使其他东西无效;
};
大小都应该是相同数字的倍数

如果这是您的意图,则说明您没有正确使用发布代码中的数字。我建议:

template<unsigned int Multiplier=1> class A
{
    public:
        static constexpr int basic_size = 256;
    protected:
        int buf[buf_size*Multiplier];
};

class B : A<2>
{
    public:
        void other_stuff();
};
模板类别A
{
公众:
静态constexpr int basic_size=256;
受保护的:
int buf[buf_size*乘数];
};
B类:A
{
公众:
使其他东西无效;
};

为什么要将其设为
静态constexpr
变量?只需将其设置为命名空间范围而不是类范围内的
constexpr
。我试图在类本身中保留尽可能多的信息,但这可能是错误的。我认为在更广的范围内定义常量更像是C语言的东西。为什么要将其设为
static constexpr
变量?只需将其设置为命名空间范围而不是类范围内的
constexpr
。我试图在类本身中保留尽可能多的信息,但这可能是错误的。我认为在更广的范围内定义常量更像是C语言。