提问人:Daniel Bauer 提问时间:10/23/2019 最后编辑:Daniel Bauer 更新时间:10/25/2019 访问量:210
使用 MSVS 避免模板化特征函数中的参数不明确
Avoiding ambiguous parameters in templated Eigen functions with MSVS
问:
我正在编写一些应该作为输入的功能。
数组的大小是恒定的,但大小是一个模板参数,应该从输入中扣除。
使用 MSVS 编译时,我必须为函数提供大小,否则会导致错误。Eigen::Array
#include <Eigen/Core>
template<unsigned short t_iSize>
void foo(const Eigen::Array<unsigned short, t_iSize, 1>&)
{
}
int main()
{
Eigen::Array<unsigned short, 3, 1> test;
// foo(test); // Compiler errors C2672 and C2784
foo<3>(test); // Giving the size solves the errors
}
大小应该可以从变量中扣除,但在计算数组的模板参数 4 和 5 时似乎失败了。test
错误 C2672:“foo”:未找到匹配的重载函数。
错误 C2784:“void foo(const Eigen::Array< unsigned short,t_iSize,1,|_Rows==&&?:&&_Rows!=?:,_Rows,1> &)”:无法从“Eigen::><Array”中推断出“const Eigen::Array< unsigned short,t_iSize,1,|_Rows==&&?:&&_Rows!=?:,_Rows,1> &”的模板参数。
取 Eigen::Array 时是否可以避免这个问题,还是需要取 Eigen::ArrayBase 作为函数参数?我想避免这种情况,因为它掩盖了该函数只接受这种特定类型的数组的事实。
编辑:
正如 Jarod42 所指出的,template 参数的类型应该是 int。
Visual Studio 可以编译此错误的代码。
但是,它无法推导参数,而其他编译器可以这样做。_Rows
在这里你可以看到我遇到的问题。
答:
2赞
Jarod42
10/23/2019
#1
声明是Eigen::Array
template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
class Eigen::Array;
您的函数对行使用了错误的类型,应该是 .unsigned short
int
template <int t_iSize>
void foo(const Eigen::Array<unsigned short, t_iSize, 1>&)
{
// ...
}
作为 Msvc 问题的解决方法,您可以执行以下操作:
手动应用默认值:
template <int t_iSize> void bar(const Eigen::Array<unsigned short, t_iSize, 1, 0, t_iSize, 1>&) { // ... }
或者添加额外的模板(因此代码更加通用):
template <int t_iSize, int Options, int MaxRows, int MaxCols> void foo(const Eigen::Array<unsigned short, t_iSize, 1, Options, MaxRows, MaxCols>&) { // ... }
评论
0赞
Daniel Bauer
10/23/2019
在我的情况下,将模板参数从 unsigned short 更改为 int 并不能使其可编译
0赞
Jarod42
10/24/2019
提供了演示链接,显示旧变体的问题。(虽然不能在 MSVC 上重现,也许是标志?
0赞
Daniel Bauer
10/24/2019
我联系了我在问题中遇到的问题。MSVS 似乎忽略了不匹配的模板类型,但当模板参数相互依赖时出现问题
1赞
Jarod42
10/24/2019
然后可能的解决方法演示
0赞
Daniel Bauer
10/25/2019
这两种解决方法可以完美地完成这项工作。你想写一个完整的答案吗?
评论