문제

3D 및 4D 모두에 대해 유용한 agnostic 템플릿 (유용한)을 갖고 싶습니다. 대부분의 작업은 첫 번째 치수가 제거 된 해독법에서 수행됩니다.

여기서 여기에 내가 갖고 싶은 것

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;
                                                   ^
.

도움이 되었습니까?

해결책

설명서 on보기, 뷰 유형의 정의를 볼 수 있습니다.

  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가 실제로 클래스 템플릿 이라는 것을 지정해야합니다.그렇지 않으면 컴파일러가 완전히 정의 된 유형이 될 것으로 기대합니다.

다른 팁

종속 이름에 대한 typename 및 / 또는 .template 자격이 필요합니다.

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

종속 이름에 템플릿 멤버를 사용하는 경우 .template 자격이 필요합니다.

obj.template foo<T>();
.

배경

에 대한이 매우 인기있는 답변을 참조하십시오

어디서 WHERE WHY "템플릿"과 "TYPENAME"키워드를 넣어야합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top