c++ - C++ 模板:值应该是编译时常量,但编译器说它不是
问题描述
template <const long long int lx, const long long int ly, const long long int lz, const long long int cx, const long long int cy, const long long int cz> class rtH{
public: static const long long int sqlc=cx*cx+cy*cy+cz*cz;
static const long long int ldc=lx*cx+ly*cy+lz*cz;
};
template <const long long int lx, const long long int ly, const long long int lz, const long long int cx, const long long int cy, const long long int cz, const long long int r> class rt{
public: static const long long int d=rtH<lx,ly,lz,cx,cy,cz>::ldc-sqrt<rtH<lx,ly,lz,cx,cy,cz>::ldc*rtH<lx,ly,lz,cx,cy,cz>::ldc-(rtH<lx,ly,lz,cx,cy,cz>::sqlc-r*r),20>::value
;
};
int main(){return rt<1,1,1,1,1,1,1>::d;}
编译器不会抱怨实例化 rt,因此它知道 lx,ly,lz,cx,cy,cz,r 是编译时常量。在 rtH 中,我将 sqlc 和 ldc 定义为 const。这些 const 变量只依赖于编译时常量,所以它们也应该是编译时常量,对吧?如果是这样,为什么编译器会抱怨 sqrt<> 的参数不是编译时常量?
注意: sqrt<> 在其他地方有效。
解决方案
const
只是意味着程序不可修改,并不意味着编译时以任何方式。constexpr
是一个不同的关键字,当应用于变量时,它意味着编译时常量。
推荐阅读
- html - 从多个类中选择一个元素
- mplab - 如果我在不同的端口中有七个段引脚,我该怎么办?
- docker - 移除容器后存储的 Docker 设置
- zsh - zsh 可以读取保留的终端关键字吗?
- javascript - Firefox 扩展无法发出发布请求,但可以使用常规脚本标签
- double - 如何将两个双打合并在一起?
- python - 如何在 python 数据框中插入值?
- excel - 我必须创建一个代码,将前面的会计符号更改为不同的版本?
- python - 自定义状态代码应该放在 django 项目中的什么位置?
- grails - wslite 肥皂连接重置,soapui 正在使用相同的肥皂信封