2011-11-07 2 views
2

저는 많은 다른 사람들처럼 개인적인 용도로 선형 대수학 라이브러리를 작성하고 있습니다. 그렇게하면서, 저는 C++로 템플릿을 프로그래밍하는 것에 대해 더 많은 것을 배우려고합니다. 나는 (예를 들어, 결정) 행렬을 정사각형으로 제한하고자하는 특정 작업가 지금동등한 매개 변수에 대한 C++ 함수 전문화

template<typename T, size_t N, size_t M = N> 
class Matrix 
{ 
    ... 
} 

같은 간다 클래스를 가지고있다. 하지만 추가하려고하면

T Determinant<T,N,N>(); 
그것은 오류가 "누락되고 함께 컴파일에 실패

';' '<'앞에. 나는 아무런 성공도없이 결정자 호출 위에 다른 템플릿을 추가하려고했습니다. 이 작업을 수행하는 방법에 대한 조언은 대단히 감사하겠습니다.

+0

'N'은 템플릿 매개 변수 이름이 아니며 정의 할 시점에 없습니다. –

답변

4

그런데 특정 템플릿 매개 변수에 대해 함수를 특수화 할 수는 없으므로 전체 클래스를 사용해야합니다. 전체 내용을 다시 코딩하고 싶지 않으므로 상속을 사용하고 싶을 것입니다.

//shared code 
template<typename T, size_t N, size_t M> 
class BaseMatrix 
{ 
    //existing code 
}; 

// non-square general case 
template<typename T, size_t N, size_t M=N> 
class Matrix : public BaseMatrix<T,N,M> 
{ 
    //forwarding headers 
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {} 
}; 

//square matrix specialization 
template<typename T, size_t N> 
class Matrix : public BaseMatrix<T,N,N> 
{ 
    //forwarding headers 
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {} 
    T Determinant(); 
}; 
+0

감사! 이것은 효과가있는 것처럼 보입니다. – Octavianus

-3

Matrix<float, 10, 10> myMatrix;과 같은 변수를 선언해야합니다.

3

이제 정방 행렬 (행렬식)으로 제한하려는 특정 작업이 있습니다.

는 는

는이 같은 무료 기능을 의미합니까

:

template< typename T, std::size_t N > 
T determinant(Matrix< T, N, N > const& m){ ... } 

또는 당신은 클래스 멤버로 의미합니까? 클래스 멤버가 필요한 경우 모든 일반 기능을 기본 클래스로 이동하고 Matrix의 템플릿 전문화를 사용하여 사각형 행렬에 대한 추가 기능을 포함하는 것이 좋습니다.

0

나는 기본 클래스 아이디어를 지원합니다. Matrix 클래스와 SquareMatrix 하위 클래스가 있어야합니다. SquareMatrix 클래스에서 Determinant 메서드를 선언하고 템플릿을 처리하지 않고 행렬이 사각형임을 안전하게 가정합니다. 행렬식 방법은 더 간단 할 것이고 그래서 그것을 호출하는 코드가 될 것입니다.

관련 문제