如何在模板化类中为``boost :: array_view``创建typedef

时间:2014-02-27 09:58:55

标签: c++ boost boost-multi-array

我想要一个维度不可知模板(对于3d和4d都有用),大多数操作将在第一维剥离的子矩阵上执行。

所以这就是我想要的

template <typename element, int dimensions>
class MMapMatrixTemplate{
public:
    typedef boost::multi_array_ref<element, dimensions> array_type; 
    typedef std::array<size_t, dimensions> index_type;
    typedef array_type::array_view<dimensions-1>::type stride_type;
};

其中array_type定义由此类管理的数组index_type定义用于索引数组的类型,我希望`stride_type定义此数组的一个切片,其中一个维度较少。

现在我收到一个错误:

  include/MMapMatrix.hh:31:55: error: non-template ‘array_view’ used as template
   typedef boost::multi_array_ref<element, dimensions>::array_view<dimensions-1>::type stride_type;
                                                   ^

2 个答案:

答案 0 :(得分:4)

您需要typename和/或.template依赖名称的资格:

typedef typename array_type::array_view<dimensions-1>::type stride_type;

如果您在依赖名称上使用模板成员,则需要.template资格:

obj.template foo<T>();

请参阅这个非常受欢迎的背景答案

Where and why do I have to put the "template" and "typename" keywords?

答案 1 :(得分:4)

documentation视图中,您可以看到视图类型的定义为:

  typedef typename Array::template array_view<3>::type view1_t;

这样就可以编译你的代码了:

#include "boost/multi_array.hpp"

template <typename element, int dimensions>
class MMapMatrixTemplate{
public:

    typedef boost::multi_array_ref<element, dimensions> array_type; 

    typedef std::array<size_t, dimensions> index_type;

    //typedef array_type::array_view<dimensions-1>::type stride_type;
    typedef typename array_type::template array_view<dimensions-1>::type stride_type;
};

int main(int argc, const char *argv[])
{

    typedef MMapMatrixTemplate<double, 4> matrix;

    return 0;
}

您需要指定array_view实际上是类模板才能使用它。否则,编译器期望它是完全定义的类型。