(참고 :. 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
최근 컴파일러 버전을 사용해 보셨습니까? – PlasmaHH
아, 죄송합니다 ... 우리는 g ++ 4.6의 플래그가없는 gcc로 제한된다는 것을 잊었습니다 : P – dunadar
부울 매개 변수를 부분적으로 지정하면'numRowsUp> = 행을 값으로 사용합니다. – AProgrammer