2013-06-27 3 views
1

(참고 :. GCC는 4.6에서 작업없이 C++ 0X 플래그, 외부 제한 나는 C++ (11) 및/또는 더와 최근의 컴파일러를 무슨 일이 일어날 지에도 관심)템플릿 인수 계산

I을 고정 크기의 행렬에 운영을위한 템플릿 클래스가 :

template<size_t rows, size_t cols, class Type> 
template<size_t numRowsUp> 
MatrixLogicalFixed<rows,cols,Type> MatrixLogicalFixed<rows,cols,Type>::shiftUp(const Type & filler) const 
{ 
    if((numRowsUp>=rows)) 
    { 
     return MatrixLogicalFixed<rows,cols,Type>(filler); 
    } 
    else 
    { 
     MatrixLogicalFixed<numRowsUp,cols,Type> temp(filler); 
     return this->getSubMatrix<rows-numRowsUp,cols>(numRowsUp, 0) 
        .joinV(temp); 
    } 
} 

아이디어는 경우이다 : 그 클래스에서

template<size_t rows, size_t cols, class Type> 
class MatrixFixed; 

, 나는 다음과 같은 측면이있는 "변화"작업을 정의 넘버 이동할 위치의 수가 전체 행 수보다 크면 기본값으로 채워진 행렬이 반환 될 수 있습니다. 이러한 경우에 그러나 (numRowsUp >= rows) 컴파일이 내부 컴파일러 오류로 종료 : force_constant_size에 gimplify.c에서 : 691 마지막 코드 줄에서 .joinV(temp)

매트릭스 크기 과정 (내 생각)시 :

  • 리턴 값 : (행 x 열) 행렬
  • getSubMatrix<rows-numRowsUp,cols>(numRowsUp, 0) : numRowsUp>=rows,이 언더 플로우를 size_t에 의한 거대한 수 초래할 것이다
  • joinV 함수가 적절한 반환 크기를 추측하려하지만 이는 불가능합니다. if 조건 컴파일 시간에 을 정의

    template<size_t rows, size_t cols, class Type> 
    template<size_t rows2, size_t cols2> 
    MatrixLogicalFixed<rows+rows2,cols,Type> MatrixLogicalFixed<rows,cols,Type>::joinV(const MatrixLogicalFixed<rows2,cols2,Type> & B) const 
    

    때문에,이 NEVER이 문제 경우에 도달 될 코드 조각은 :

이는 joinV 선언)이다. 지금까지 시도한 내용은 다음과 같습니다.

  • 프리 프로세서 #if에서 템플릿 매개 변수를 사용합니다.
  • 트릭을 수행 할 수있는 모든 종류의 전 처리기 매크로 MIN 또는 MAX를 찾으십시오.

무한한 값 조합이 있기 때문에 일반적인 부분 전문화는 유효한 해결 방법처럼 보이지 않습니다 ... 모든 종류의 솔루션에 열려 있습니다. 나는 단지 클래스를 컴파일하기를 원한다 : D

+1

최근 컴파일러 버전을 사용해 보셨습니까? – PlasmaHH

+0

아, 죄송합니다 ... 우리는 g ++ 4.6의 플래그가없는 gcc로 제한된다는 것을 잊었습니다 : P – dunadar

+1

부울 매개 변수를 부분적으로 지정하면'numRowsUp> = 행을 값으로 사용합니다. – AProgrammer

답변

0

전 처리기 MAX에는 어떤 문제가 있는가? 템플릿 인수로 MAX(0, rows-numRowsUp)을 사용할 수 있습니다. 또는 템플릿 인수로 이것을 시도하십시오 : (numRowsUp>=rows)? 0 : rows-numRowsUp. 이 방법은 틀린 템플렛 결코 instaniated 결코 없을 것이다.

+0

무엇 ... 나는 이것을 시험해 보았다. 그리고 컴파일러는 나에게 소리 쳤다. 올바른 MAX가 사용되도록 요구 사항이 있습니까? – dunadar