我写了这个函数
template <typename T>
double norm(const T & v, const int p) {
return v.template lpNorm<p>();
}
但它不起作用并给出错误:
error: 'p' is not a constant expression
return v.template lpNorm<p>();
^
我似乎认为编译器期望p
在编译时就知道,而我的p
是动态的。
可能相关:
为什么这不是一个常量表达式? https://stackoverflow.com/questions/24580714/why-is-this-not-a-constant-expression
非类型模板参数不是常量表达式 https://stackoverflow.com/questions/18177721/non-type-template-argument-is-not-a-constant-expression
我怎样才能解决这个问题?
你可以用有限的范围来部分地做到这一点p
. For lpNorm
操作通常就足够了。
您已经知道需要一个编译时常量作为模板参数。然而作为p
通常在小范围内使用(0,1,2,if),您可以使用以下技巧使其适用于常用的一小部分int
values.
template<typename T>
double norm(const T & v, const int p) {
switch (p) {
case 0:
return v.template lpNorm<0>();
break;
case 1:
return v.template lpNorm<1>();
break;
case 2:
return v.template lpNorm<2>();
break;
case Eigen::Infinity:
return v.template lpNorm<Eigen::Infinity>();
break;
default:
break;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)