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

标签 c++ eigen eigen3

我写了一个函数

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

它采用三个 N 维点,如果它们在一定容差内共线,则返回 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::Vector3dEigen::Vector<double, 3>Eigen::Matrix<double, 3, 1> ,但这些都不能解决问题。我也尝试过将 N 的类型设置为 std::size_t ,但这也没有帮助。

最佳答案

正如评论中提到的,这可能是一个错误。解决方法是拼出 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

关于C++ 函数模板未推导特征向量大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74524472/

相关文章:

c++ - Eigen3 replicate() 用于矩阵 vector cwiseProduct 操作

c++ - 让应用程序拥有 CPU 和 GPU 计算后端的最佳方式是什么

c++ - 在 Eigen 中乘以变换和矩阵类型

c++ - 减少基于特征的模板

c++ - 在 Eigen 中计算 SparseMatrix 1-范数、Inf-范数的有效方法

c++ - AccessibleObjectFromWindow 返回 E_FAIL 代码

c++ - 这个循环有什么问题吗?

c++ - 在 std vector 中将元素分配给 Eigen::Vector2d 会引发错误

c++ - 为什么错误: "reference to fixes is ambiguous" is occurring in the code?

c# - 尝试读取或写入 protected 内存。这通常表明其他内存已损坏 DllImport