2017-10-20 1 views
0

간단한 매트릭스 클래스 템플릿을 구현하려고합니다. 기본적으로 Matrix (data1, .., dataN)처럼 인스턴스화하고 싶습니다. 기본적으로 2 개의 부호없는 int를 사용하는 템플릿 클래스를 정의한다고 생각했습니다. 템플릿 매개 변수, 오른쪽이 포함 된 데이터의 유형을 추론 할 초기화 목록을 사용하는 등 지금은이 간단한 시작 썼다 :템플릿의 매트릭스 템플릿

template<size_t N, size_t M> 
class Matrix { 

    public: 

    template<typename ...T> 
     constexpr Matrix<N,M>(T ... args) noexcept 
      : data{std::forward<T>(args)... } 
      { 
       static_assert(sizeof...(args) <= N*M, "Insufficent element for a Matrix "); 

      } 

    const auto getData()const { return data; } 


    private: 

    template<typename T> 
    std::valarray<T> data ; 
}; 

을하지만 난이 오류가 발생했습니다 ..

error: data member ‘data’ cannot be a member template std::valarray data ;

당신을 그래서 뭐 생각해? 그녀의 초기화 (생성자에 전달 된 매개 변수)에 의해 행렬 의 유형을 추론하고이 시간을 모든 클래스 정의에 따라 을 사용하여 추론하는 방법이 있습니까?

+2

멤버 변수가 C++ 14 이상에서 템플릿 화 될 수 있는지는 모르겠지만 왜 어떻게 'T'가 전체 클래스의 매개 변수가 아닌지 알 수 있습니까? – user463035818

+0

'typename T '가 클래스의 첫 번째 (또는 마지막) 템플릿 인자가 될 것으로 기대합니다. – grek40

+0

왜냐하면 나는 이들을 인스턴스화하기 위해서 이라는 행렬을 사용할 것이기 때문에 클래스 템플릿 매개 변수는 여야합니다 ... 어디에서 T를 삽입 할 수 있습니까 ?? 무엇을 추론하니? –

답변

4

template <typename T>을 생성자에 전달할 수 없습니다. 행렬은 생성자가 호출되기 전에 무엇을 저장할지 알 필요가 있습니다. 그렇지 않으면 행렬 객체의 크기를 계산할 수 없습니다.

template <typename T, std::size_t N, std::size_t M> 
class Matrix 
{ 
public: 
    // Constructors and stuff 

private: 
    std::valarray<T> data ; 
}; 

: 그래서,이 같은 클래스를 선언해야합니다 (참고 : C++에는 size_t 유형이 없습니다를하지만 std::size_t가)

T을 추론의 비 가능성 성가신 일이다. 사람들은 함수의 인수 유형을 파생시키는 능력에 의존하여 std::make_pair, std::make_tuple 등과 같은 래퍼를 작성했습니다.

표준에는 원하는 기능이 있습니다 (class template argument deduction). 심지어 하나 같이, 공제 프로세스를 안내 할 수 있습니다 :

template <typename T, std::size_t N> 
struct array 
{ 
    T data[N]; 

    template <typename ... X> 
    array (X ... x) 
     : data{x...} 
    { } 
}; 

template <typename ... X> 
array(X ...) -> array<std::common_type_t<X...>, sizeof...(X)>; 

Unfortunatelly, 귀하의 경우는 NM을 도출하는 것은 불가능합니다, 그래서 당신은이 기능을 사용하려면 생성자의 서명을 변경해야 .

+0

미안해, 이해가 안돼 ... 어느쪽으로? –

+1

@MarcoGhiani : lisyarus 제안으로 클래스 템플릿 매개 변수로 이미'T'를 갖기 때문에 생성자를 템플릿 화하지 마십시오. 또한 이제는'data'가 템플릿이 아닌 정규 멤버가 될 것입니다 –

+0

아니요 ... 템플릿이 있습니다. ' –

관련 문제