C++ Eigen在行模板的可变模板扩展方面存在问题

C++ Eigen在行模板的可变模板扩展方面存在问题,c++,visual-studio,variadic-templates,eigen,C++,Visual Studio,Variadic Templates,Eigen,我正在尝试创建一个使用特征:矩阵的网格;有关图书馆,请参阅 让我们来看一小段代码: template<typename Types, int... Sizes> class Grid; template<typename... Types, int... Sizes> class Grid<std::tuple<Types...>, Sizes...> { public: using grid_type = std::tuple<E

我正在尝试创建一个使用
特征:矩阵的网格
;有关图书馆,请参阅

让我们来看一小段代码:

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>...>;
};
在编译VS2017时,我发现以下三个错误:

错误C3548“\u行”:参数包不能在此上下文中使用

错误C2976“特征::矩阵”:模板参数太少

错误C3546“…”:没有可扩展的参数包

错误C3203“矩阵”:非专用类模板不能用作模板参数“\u类型”的模板参数,应为实类型

现在,如果我们使用类似于
std::array
的东西,那么即使使用-1参数,一切都很好(它只是转换为正的
size\u t
):

使用grid\u type=std::tuple;
grid\u type
按预期显示


现在还有一个问题,VS的intellisense能够正确评估Eigen版本,但它无法编译它…

好的,所以我找到了答案。由于
Eigen::Matrix
对某些构造函数参数使用默认值,在本例中,这些参数取决于Rows/Cols参数(其中Rows是可变模板),因此编译器会感到困惑。我明确列出了所有参数,并编译:

using grid_type = std::tuple<Eigen::Matrix<Types, Sizes, 1, Eigen::AutoAlign | false, Sizes,1>...>;
使用grid\u type=std::tuple;

然而,这仍然不能让我满意,因为intellisense可以处理这个问题,但编译器不能。好的,所以我找到了答案。由于
Eigen::Matrix
对某些构造函数参数使用默认值,在本例中,这些参数取决于Rows/Cols参数(其中Rows是可变模板),因此编译器会感到困惑。我明确列出了所有参数,并编译:

using grid_type = std::tuple<Eigen::Matrix<Types, Sizes, 1, Eigen::AutoAlign | false, Sizes,1>...>;
使用grid\u type=std::tuple;

然而,这仍然不能让我满意,因为intellisense可以处理这一点,但编译器不能。

事实上,使用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>...>;
模板
使用Mat=特征::矩阵;
使用grid_type=std::tuple;

事实上,这在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>...>;
模板
使用Mat=特征::矩阵;
使用grid_type=std::tuple;