我正在尝试创建一个使用Eigen:Matrix
的网格;有关图书馆的信息,请参阅here。
让我们看一下最小的代码:
template<typename Types, int... Sizes> class Grid;
template<typename... Types, int... Sizes>
class Grid<std::tuple<Types...>, Sizes...>
{
public:
using grid_type = std::tuple<Eigen::Matrix<Types, Sizes, 1>...>;
};
然后在main
中,例如:
Grid<std::tuple<long, int>, -1, 10000>::grid_type;
编译时,VS2017中出现以下三个错误:
错误C3548'_Rows':参数包不能在此上下文中使用
错误C2976'Eigen :: Matrix':模板参数太少
错误C3546'...':没有可用于展开的参数包
错误C3203'Matrix':非专用类模板不能用作模板参数'_Types'的模板参数,期望是真实类型
现在,如果我们使用std::array
之类的东西,那么即使使用-1参数,一切都很好(好吧它只是转换为正size_t
):
using grid_type = std::tuple<std::array<Types, Sizes>...>;
grid_type
按预期出现。
现在什么也是bizzare,VS的intellisense能够正确评估Eigen版本,但它无法编译...
答案 0 :(得分:1)
好的,所以我明白了。因为Eigen::Matrix
使用某些构造函数参数的默认值,在这种情况下,它们依赖于Rows / Cols参数(其中Rows是可变参数模板),因此编译器会感到困惑。我明确列出了所有参数,并编译:
using grid_type = std::tuple<Eigen::Matrix<Types, Sizes, 1, Eigen::AutoAlign | false, Sizes,1>...>;
但是,这仍然不能满足我的要求,因为智能感知可以解决这个问题,但编译器不能这样做。
答案 1 :(得分:1)
事实上,这与GCC,clang和ICC编译良好,但MSVC没有运气。这是MSVC的一个更好的解决方法:
template<typename Scalar,int Rows>
using Mat = Eigen::Matrix<Scalar, Rows, 1>;
using grid_type = std::tuple<Mat<Types,Sizes>...>;