2013-10-27 2 views
0
template <typename T, unsigned D> 
class Matrix 
{ 
public: 
    T Determinant(void) const; 

    T m[D][D]; 
}; 


template <typename T> 
T Matrix<T, 2>::Determinant(void) const 
{ 
    return m[0][0] * m[1][1] - m[1][0] * m[0][1]; 
} 

안녕하세요, 포럼. 이 코드를 가지고, 그러나 나는 오류 얻을 : 무엇이 잘못되었는지템플릿 부분적 구체화

1>c:\dropbox\projects\math\matrix.h(319): error C3860: template argument list following class template name must list parameters in the order used in template parameter list 
1>c:\dropbox\projects\math\matrix.h(319): error C2976: 'Math::Matrix<T,D>' : too few template arguments 

모른다. 도와주세요.

+0

저는 여러분이 개별 클래스가 아닌 전체 클래스를 전문화 할 수 있다고 생각합니다. – Adam

+0

부분 템플릿 특수화로 인한 [ "불완전 유형의 유효하지 않은 사용"오류] 가능한 복제본 (http://stackoverflow.com/questions/165101/invalid-use-of-incomplete-type-error-with-partial-template-specialization) –

+0

당신이 할 수있는 일은'결정자 (Determinant) '를 비회원 (친구 일 수도 있음)으로 만들고 과부하 *로 만드는 것입니다. –

답변

2

해당 클래스 전문화에 대한 정의를 제공해야합니다. 예를 들어 : 그없이

template <typename T, unsigned D> 
class Matrix 
{ 
public: 
    T Determinant(void) const; 

    T m[D][D]; 
}; 

template <typename T> 
class Matrix <T, 2> 
{ 
    T m[2][2];  

public: 
    T Determinant (void) const; 
}; 

template <typename T> 
T Matrix<T, 2>::Determinant (void) const 
{ 
    return m[0][0] * m[1][1] - m[1][0] * m[0][1]; 
} 

, 컴파일러는 Matrix<T, 2>의 전문 버전이 Determinant 방법이 포함 된 경우 말할 수 없습니다.