2012-08-08 3 views
4

그래서 나는 다음과 같은 연산자 과부하를 갖고 만든 일반적인 Matrix 클래스가 있습니다.C++ 연산자 과부하 및 상속

class Matrix2 : public Matrix 
{ 
}; 

나는 행렬 2 내가 내용의 컴파일러 오류 얻을 함께 개체를 두 곱하려고 할 때 :

'형 행렬 2의 왼쪽 피연산자를 취 찾을 수 없습니다 연산자가없는을 (또는 접근 변환 없음) '

왜 그런가요? 상속으로 연산자 오버로드를 올바르게 구현할 수있는 방법은 무엇입니까?

는 편집 :

으로 내 문제는 부분적으로 있기 때문에 "가장 성가신 구문 분석"이었다 지적했다. 이제 제 문제는 연산자 오버로드와 상속과 엄격하게 관련이 있다고 생각합니다.

2 개의 Matrix 객체를 곱하면 좋지만 2 개의 Matrix2 객체를 함께 곱할 수는 없습니다.

Matrix2 i; 
Matrix2 m; 
Matrix result = m * i; 

오류 메시지가 :

error C2678: binary '*' : no operator found which takes a left-hand operand of type 'Matrix2' (or there is no acceptable conversion).

+0

이것은 단지 추측이지만 과부하 선언 전에 public 수정자를 추가 할 수 있습니까 –

+0

연산자 오버로드가 내 Matrix 클래스의 public 섹션에 있습니다. – Bob

+3

모든 경우에있어, 사용자가 수행하는 것과 동일한 오류를 다른 사용자가 경험할 수있게하는 최소한의 완전한 예제가 유용합니다. – PlasmaHH

답변

3

당신은 가장 골치 아픈 구문 분석을 물고있다. 이것은 객체가 아닌 함수의 선언을 유도하는 구문상의 오류입니다.

+0

오! 무슨 뜻인지 알 겠어. 그러나, 나는 2 개의 생성자를 가진다 : 하나는 인수를 취하지 않고 하나는 몇몇 인수를 취한다. 2 개의 객체 (하나는 매개 변수가없는 생성자를 사용하고 다른 하나는 생성자를 사용하여 여러 매개 변수를 사용)를 선언하고 함께 곱하면 컴파일러는 여전히 불평합니다. – Bob

+0

위의 질문을 업데이트했습니다. – Bob

2

문제는 오버로드 된 연산자를하지 않습니다, 그것은 당신이, 당신은 아마 m1m2 유형 Matrix의하지만 그들이 실제로하는 (매개 변수없이) 기능 Matrix을 반환하는 것을 생각하고 정의 된 변수입니다. 선언에서 괄호를 제거하고 상황이 나아 졌는지 확인하십시오.

이것은 @DeadMG가 그의 답변에서 언급 한 Most Vexing Parse입니다.

2

연산자 오버로드시 this article을 확인하십시오. 매우 잘 설명합니다.

@silvesthu가 설명하기 때문에 곱셈 연산자를 2 개의 인수를 취하고 새로운 Matrix 개체를 반환하는 정적 함수로 구현하는 것이 좋습니다. *= 연산자를 사용하는 것과 같은 방법으로 클래스를 수정해야하는 경우 정적 함수로 구현할 수 있습니다. 다음 코드를 컴파일

업데이트

은 나를 위해 작동;

class Matrix 
{ 
public: 
    Matrix() {} 
    Matrix(int i, int j, int k) {} 
    Matrix operator*(const Matrix &right) 
    { 
     return Matrix(); 
    } 
}; 

class Matrix2 : public Matrix 
{ 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Matrix2 a, b; 
    Matrix c = a * b; 
    return 0; 
} 

실제로 두 Matrix2 개체를 함께 곱할 수 있음을 보여줍니다. 나는 왜 당신이 전혀 문제를 일으키는 지 확신하지 못한다.