C++函数模板未推导特征向量大小

pkmbmrz7  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(138)

我写了一个函数

template <int N>
bool checkColinear(const std::array<Eigen::Vector<double, N>, 3>& points) noexcept;

该函数接受三个N-D点,如果它们在一定容差范围内共线,则返回true。

std::array<Eigen::Vector3d, 3> points = {Eigen::Vector3d{0.0, 1.0, 0.0},
                                         Eigen::Vector3d{0.0, 3.0, 0.0},
                                         Eigen::Vector3d{0.0, 2.0, 0.0}};

auto result = checkCollinear<3>(points);

但是如果我试图在没有显式指定N的情况下调用函数,编译器会报告一个错误:

auto result = checkCollinear(points);

我得到的错误是“error C2672:“检查共线”:没有找到匹配的重载函数””。在这种情况下,编译器是否可以推导出模板参数?我使用的是MSVC 143(VS 2022)和C++20。
我已经尝试过将Eigen::Vector3d显式地更改为Eigen::Vector<double, 3>Eigen::Matrix<double, 3, 1>,但这两种方法都不能解决问题。我也尝试过将N的类型改为std::size_t,但这也无济于事。

plicqrtu

plicqrtu1#

正如评论中提到的,这可能是一个bug。一个解决方案是将Vector<double, N>的完整类型名拼写为:

Matrix<double, N,  1,          0,            N,         1>
                   ^           ^             ^          ^
                  col    row/col major    max rol    max col

您的函数签名将变为:

template <int N>
bool checkCollinear(const std::array<Eigen::Matrix<double, N, 1, 0, N, 1>, 3>& points) noexcept;

Demo

相关问题