gpt4 book ai didi

c++ - 模板元编程 : "does not have integral or enumeration type"

转载 作者:行者123 更新时间:2023-11-30 05:11:50 24 4
gpt4 key购买 nike

我正在尝试使用模板编写一个“幂”函数。

#define VAR_X 2.0f

template <int N> struct Power
{
static const float ret = VAR_X * Power<N-1>::ret;
};

template <> struct Power<0>
{
static const float ret = 1.0f;
};

我为变量使用了一个宏,因为 float 不能用作模板参数。当我尝试使用 g++ 5.4.0 进行编译时,我得到了这个:

tmptrig.cpp: In instantiation of ‘const float Power<1>::ret’:
tmptrig.cpp:35:28: required from here
tmptrig.cpp:17:24: error: the value of ‘Power<0>::ret’ is not usable in a constant expression
static const float ret = VAR_X * Power<N-1>::ret;
^
tmptrig.cpp:22:24: note: ‘Power<0>::ret’ does not have integral or enumeration type
static const float ret = 1.0f;

但是,当我将程序更改为仅处理整数时,它工作正常。

#define VAR_X 2

template <int N> struct Power
{
static const int ret = VAR_X * Power<N-1>::ret;
};

template <> struct Power<0>
{
static const int ret = 1;
};

我知道 float 不能用作模板参数,但(据我所知)这里不是这样对待它们的。为什么编译器不喜欢我使用 float ?

编辑:这是我的main 的样子:

int main(int argc, char *argv[])
{
std::cout << Power<1>::ret << std::endl;
}

最佳答案

问题不在于 float 不能是常量表达式,因为它们可以(尽管不允许作为模板非类型参数)。问题是您的代码需要明确标记它们,否则它们无法在类定义本身中初始化。

#include <iostream>

float constexpr var_x = 2.0f;

template <int N> struct Power
{
static constexpr float ret = var_x * Power<N-1>::ret;
};

template <> struct Power<0>
{
static constexpr float ret = 1.0f;
};

int main(int argc, char *argv[])
{
std::cout << Power<1>::ret << std::endl;
}

这与您的初衷几乎相同,因为 constexpr 意味着 const

Clang 会针对您的原始代码提供更有用的警告:

error: in-class initializer for static data member of type 'const float' requires 'constexpr' specifier [-Wstatic-float-init]
static const float ret = VAR_X * Power<N-1>::ret;

它们甚至可以在 C++03 中成为常量表达式(以及元函数的结果),但这需要类外定义:

float const var_x = 2.0f;

template <int N> struct Power
{
static const float ret;
};

template <int N>
const float Power<N>::ret = var_x * Power<N-1>::ret;

template <> struct Power<0>
{
static const float ret;
};

const float Power<0>::ret = 1.0f;

关于c++ - 模板元编程 : "does not have integral or enumeration type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44871322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com