C++ 模板循环需要常量值

C++ 模板循环需要常量值,c++,templates,C++,Templates,如何使编译时已知的const参数在以下代码中用作模板参数 错误: test.cpp(13): error: expression must have a constant value loop<nd>(); test.cpp(13):错误:表达式必须具有常量值 loop(); 代码: #包括 模板 内联void循环(void){ STD::CUT< P>你不能这样做,因为C++类型的系统不够强大,不能让你这样做。没有办法强制传递给 BuldCaskLoop的参数是一个

如何使编译时已知的const参数在以下代码中用作模板参数

错误:

test.cpp(13): error: expression must have a constant value
      loop<nd>();
test.cpp(13):错误:表达式必须具有常量值
loop();
代码:

#包括
模板
内联void循环(void){

STD::CUT< P>你不能这样做,因为C++类型的系统不够强大,不能让你这样做。没有办法强制传递给 BuldCaskLoop的参数是一个常量表达式(即编译时常量),因此编译器不能允许你使用这个参数作为模板参数。
您只需直接从
main()调用
loop()
,或make
broadcast\u loop
nd
作为模板参数。

函数的参数永远不能像您描述的那样使用,因为函数的定义永远无法证明在所有调用上下文中函数的参数都是常量表达式。实际上,您要寻找的是
constexpr
,而不是
const
,但是您不能
constexpr
函数参数(出于我刚才介绍的原因)。您可以做的是在模板中传递整数:

template <int nd>
inline void broadcast_loop(){
    loop<nd>();
}

int main(void){
constexpr int nd = 3;
broadcast_loop<nd>();
模板
内联无效广播_循环(){
loop();
}
内部主(空){
constexpr int nd=3;
广播_循环();
}


请注意,在我的
main
中,我需要
constepr
,而不仅仅是
const
,您调用
loop
的值在编译时不一定是已知的。我想您需要
constepr
,这与const不同。“我需要
constepr
,而不仅仅是
const
”事实上,你没有。
template <int nd>
inline void broadcast_loop(){
    loop<nd>();
}

int main(void){
constexpr int nd = 3;
broadcast_loop<nd>();