2013-11-21 2 views
1

저는 C++에서 절대적으로 초보자입니다. 여러분의 도움에 진심으로 감사드립니다!템플릿 매개 변수 변수/동적 인스턴스화

현재 데이터 형식, 차원 너비 및 차원 높이에 대한 템플릿 매개 변수가있는 Matrix 클래스를 구현 중입니다. I가 결과 행렬을 생성해야 승산 기능에

template <class T, int rows, int columns> class Matrix 

(높이 매트릭스 A는 폭 매트릭스 B, X),하지만 오류 "템플릿 값은 상수 식에서 나타나는 없습니다".

// overload * for matrix multiplication 
    template <class T, int rows, int columns> 
    Matrix<T, rows, columns> operator*(Matrix<T, rows, columns> a, Matrix<T, rows, columns> b) { 
    Matrix <T, rows, columns> result = new Matrix<T, a->height, b->width>; 
// make multiplication here 

모든 아이디어를 어떻게 지정된 형태와 인공 호흡기의 높이와 새로운 매트릭스를 만드는 방법. 너비는 B?

정말 고마워요!

+0

먼저 매트릭스 곱셈 규칙을 검토하십시오. 예를 들어 (r1, c1) 행렬과 (r2, c2) 행렬을 곱하면 c1 == r2가 필요하고 (r1, c2) 결과가 나온다. –

답변

1

오류가 표시되면 정적 (컴파일 타임) "필드"를 동적 (런타임) 값으로 설정할 수 없습니다.

template <class T, int rows_A, int columns_A, int rows_B, int columns_B> 
Matrix<T, rows_A, columns_B> operator*(Matrix<T, rows_A, columns_A> a, Matrix<T, rows_B, columns_B> b) { 
    Matrix <T, rows_A, columns_B> result; 
    // ... 
    return result; 
} 

을 그리고 조 Z. 말한대로, 당신은거야 :

당신은 당신의 두 행렬의 크기에 다른 템플릿 매개 변수를 사용하여 그들과 함께 새로운 행렬을 작성 (이해야 말을하지 않음) 할 수 이전에 수술의 유효성을 확인해야합니다. columns_Arows_B과 같아야하므로 두 개의 템플릿 매개 변수를 인수 분해 할 수 있습니다.

편집 :이 코드는 쉽고도 사용할 찾고 정말 좋지 않다, 그러나

template <class T, int rows_A, int columns_A_rows_B, int columns_B> 
Matrix<T, rows_A, columns_B> operator*(
    Matrix<T, rows_A, columns_A_rows_B> a, 
    Matrix<T, columns_A_rows_B, columns_B> b 
) { 
    Matrix <T, rows_A, columns_B> result; 
    // ... 
    return result; 
} 

: mmmmmmm 아래 의견이 인수 분해를 썼다. 가능한 경우 Matt이 제안한 것처럼 크기를 동적으로 만드는 아이디어 (매개 변수 템플릿이 아님)를 시도 할 수 있습니다.

+0

그러나 행렬 크기는 지정되지 않으므로 여러 가지가 될 수 있습니다. 열/행 매개 변수없이 새 Matrix를 만드는 방법이 있습니까? 어쩌면 템플릿 전문 분야와 같은 것이 가능한 해결책 일 수 있습니까? – Patrick

+0

템플릿은 무한한 가능성을 표현하는 방법이 아닙니다. 그들은 코드에 있지만 프로그램이 실행 중일 때는 아닙니다. 행과 열의 정확한 값은 프로그램을 컴파일하는 동안 정의됩니다. 컴파일하는 동안 행렬의 크기가 "정의 가능"하지 않으면 템플리트를 사용하는 아이디어를 포기해야합니다. 또한 T/행/열의 각 조합이 템플릿을 사용하여 새 고유 클래스 정의를 생성한다는 사실을 잊지 마십시오. 행렬의 크기가 크게 다를 경우 템플리트는 응용 프로그램에 위험 할 수 있습니다. –

+0

템플릿 전문화로 할 수있는 일을 실제로 볼 수는 없습니다. 각 T/행/열 조합을 직접 작성해야하기 때문입니다 ... 템플릿을 증명하는 코드는 이상적인 솔루션이 아닙니다.) –

1

행과 열을 생성자의 매개 변수로 사용하는 것은 어떻습니까?

템플릿 클래스 매트릭스

{
공개 (행 INT, 열을 INT)
매트릭스 {....}
}

// 당신은으로 새 인스턴스를 만들 수 있습니다 :

Matrix <T>* result = new Matrix<T> (a->height, b->width) 
+0

하지만 템플릿을 사용해야하는데 템플릿을 사용하면 다른 방법이 있습니까? – Patrick

+0

@ 패트릭 다른 길은 없다고 생각합니다. 템플릿 인스턴스화는 컴파일 중에 발생하지만 런타임 중에 발생하지는 않습니다. 따라서 변수를 전달하면 컴파일러는 컴파일 타임에 유형이 무엇인지 결정할 수 없습니다. 여기에 질문이 있습니다. – Matt

-1

그것은이 줄처럼 보이는 :

Matrix <T, rows, columns> result = new Matrix<T, a->height, b->width>; 

오류입니다. 스택에 선언 된 변수에 새 주소를 쓰려고합니다. 이 시도 :

Matrix<T, int, int> *result = new Matrix<T, a->height, b->width>(); 
+0

불행히도 g ++ 컴파일러가 작동하지 않습니다. matrix.h : 68 : 23 : 오류 : 'template 에 대한 템플릿 매개 변수 목록의 인수 2에서 형식/값이 일치하지 않습니다. ' 매트릭스 * 결과 = new 매트릭스 높이, b-> 너비>(); – Patrick

+0

이제 알겠습니다. 그건 내 잘못입니다. 이 코드를 실행하려고하는 사람이 있으면 해보십시오. 정보에 대한 @ 패트릭 감사합니다. 있어야합니다 : 매트릭스 * 결과 = 새로운 매트릭스 (a-> 높이, b-> 너비); – marcinioski

1

한번에 두 개의 서로 다른 개념을 생각하는 매트릭스 및 템플릿 방법입니다 * 연산자의 데이터를 저장하는 템플릿 클래스 매트릭스를 참조 할 때.

* 연산자를 템플릿 클래스를 곱하는 템플릿 메서드로 생각하면 더 많은 템플릿 인수가 필요하며 이러한 인수는 행렬 클래스의 한 인스턴스에 의해 부분적으로 만 제공된다는 것을 알게됩니다.

a-> width 및 a-> height는 컴파일시 모르기 때문에 모든 템플릿 인수는 컴파일시 알려야하기 때문에 오류가 발생합니다.