【问题标题】:Avoiding ambiguous parameters in templated Eigen functions with MSVS使用 MSVS 避免模板化特征函数中的不明确参数
【发布时间】:2019-10-23 10:36:09
【问题描述】:

我正在编写一些应该以Eigen::Array 作为输入的函数。 数组的大小是恒定的,但大小是一个模板参数,应该从输入中扣除。 使用 MSVS 编译时,我必须向函数提供大小,否则会导致错误。

#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
}

大小应该可以从变量test中扣除,但是在计算Array的模板参数4和5时似乎失败了。

错误 C2672:“foo”:找不到匹配的重载函数。

错误 C2784:“void foo(const Eigen::Array &)”:无法为"const Eigen::Array &" 来自 "Eigen::Array”。

在取 Eigen::Array 时是否可以避免这个问题,还是需要将 Eigen::ArrayBase 作为函数参数?我想避免这种情况,因为它掩盖了函数只采用这种特定类型的数组这一事实。

编辑:

正如 Jarod42 所指出的,模板参数应该是 int 类型。 Visual Studio 可以编译出现此错误的代码。 但是,它无法推断出参数_Rows,而其他编译器可以这样做。

Here你可以看到我遇到的问题。

【问题讨论】:

    标签: c++ visual-studio eigen compiler-bug


    【解决方案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>&)
    {
        // ...
    }
    

    Demo

    作为 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>&) {
        // ...
      }
      

    Demo

    【讨论】:

    • 将模板参数从 unsigned short 更改为 int 在我的情况下无法编译
    • 提供的演示链接显示旧变体的问题。 (虽然不能在 msvc 上重现,也许是标志?)
    • 我链接了我在问题中遇到的问题。 MSVS似乎忽略了不匹配的模板类型,但是当模板参数相互依赖时出现问题
    • 那么可能的解决方法Demo
    • 这两种变通方法完美地完成了这项工作。你想写一个完整的答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多