使用 MSVS 避免模板化特征函数中的参数不明确

Avoiding ambiguous parameters in templated Eigen functions with MSVS

提问人:Daniel Bauer 提问时间:10/23/2019 最后编辑:Daniel Bauer 更新时间:10/25/2019 访问量:210

问:

我正在编写一些应该作为输入的功能。 数组的大小是恒定的,但大小是一个模板参数,应该从输入中扣除。 使用 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

在这里你可以看到我遇到的问题。

C++ visual-Studio 特征生成 编译器-bug

评论


答:

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 shortint

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
这两种解决方法可以完美地完成这项工作。你想写一个完整的答案吗?