템플릿 클래스에서``boost :: array_view``에 대한 Typedef를 만드는 방법
-
23-12-2019 - |
문제
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"키워드를 넣어야합니까?
제휴하지 않습니다 StackOverflow