如何使用模板矩阵作为输入来调用lpNorm
?
这是我的代码中的问题:
template<class number>
void normalize_in_place(Matrix<number,Dynamic,Dynamic> & A, level l, axis a){
const int p = lp_norms::level2pvalue(l);
switch ( a ) {
case row:
// TODO: get lpnorm working.
A = A.transpose().cwiseQuotient(A.rowwise().lpNorm<p>()).transpose();
//A = A.transpose().cwiseQuotient(A.rowwise().norm()).transpose();
break;
case col:
// TODO: get lpnorm working.
//A = A.cwiseQuotient(A.colwise().lpNorm<p>());
A = A.cwiseQuotient(A.colwise().norm());
break;
}
}
在编译过程中失败:
错误:[lpNorm函数的右括号]之前的预期主表达式
在这里我用括号代替了在编译器输出中看到的箭头。
**在7月23日的发行版中刷新了本征后,出现以下错误:
错误:类型为“”和“ const int”的无效操作数为二进制“ operator <” A = A.transpose()。cwiseQuotient(A.rowwise()。lpNorm
())。transpose();
显然,lpNorm
没有解决;但是,我包含了Eigen/Dense
,标准的.norm()
也可以使用。
无论我使用哪种配置,它都不起作用。
调用lpNorm
的正确方法是什么?
答案 0 :(得分:3)
如果模板中包含以下代码,其中A
的类型取决于模板参数:
A.rowwise().lpNorm<p>();
在模板函数之前需要template
关键字:
A.rowwise().template lpNorm<p>();
请参见Where and why do I have to put the "template" and "typename" keywords?。
在没有template
关键字的情况下,GCC尝试将<
中的<p>
视为小于运算符,并生成您看到的错误消息。 Clang提供了更有用的错误消息error: missing 'template' keyword prior to dependent template name 'lpNorm'
。
还请注意,p
中的模板参数lpNorm<p>
必须是恒定表达式(在编译时求值)。在您的示例中,lp_norms::level2pvalue(l)
似乎不是常量表达式。