c++函数模板不推导特征向量大小



我写了一个函数

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

取三个N-D点,如果它们在一定公差内共线则返回true。如果调用函数并显式指定N:

,则一切正常
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);

我得到的错误是"错误C2672: 'checkCollinear':没有找到匹配的重载函数"。在这种情况下,编译器是否可以推断模板参数?我使用的是MSVC143 (VS2022)和c++ 20。

我已经尝试显式地将Eigen::Vector3d更改为Eigen::Vector<double, 3>Eigen::Matrix<double, 3, 1>,但这两个都没有修复它。我也试过把N的类型设为std::size_t,但是也没用。

正如评论中提到的,这可能是一个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;

演示

最新更新