사용

2012-04-28 4 views
1

나는 이런 식으로 뭔가를 :사용

CLASS CLASS::operator|(CLASS& right) { 
    return binop(*((CLASS*) this), right, OP_OR); 
} 

클래스는 어떤 클래스입니다. 난 그냥 현재 개체를 전달하는 데 문제가 지금

someheader.h: In member function 'void CLASS::set(int64_t)': 
someheader.h:469:29: error: no match for 'operator|' in '*(CLASS*)this | CLASS(bit)' 
someheader.h:469:29: note: candidate is: 
someheader.h:376:1: note: CLASS CLASS::operator|(CLASS&) 
someheader.h:376:1: note: no known conversion for argument 1 from 'CLASS' to 'CLASS&' 

: binop의 프로토 타입은

CLASS binop(CLASS& left, CLASS& right, OP op);

이 모두 잘 작동하고 비주얼 C++ 2010를 사용하여 컴파일하지만 오류로 인해 ++ g에 실패 (* this)를 일부 매개 변수로 사용하기 때문에 명시 적으로 캐스팅하여 포인터에 const 한정자를 제거하고 정상적으로 작동하고 Visual C++ 컴파일러를 속여 일반 포인터로 사용하도록 만듭니다. g ++는 이것을 좋아하지 않습니다. 캐스트를 제거하면 this이 const 한정이므로 계속 오류가 발생합니다. 연산자의 왼쪽 및 오른쪽 크기로 수행 할 작업은 둘 다 변경할 수 있어야합니다.

내가 수집 할 수있는 것으로부터, 어떤 객체를 전달하고 함수 호출에서이를 참조로 변환하는 데 문제가있는 것처럼 보입니다 ... 어느 것이 나에게별로 의미가 없습니다. 어떤 제안?

+2

함수가 CLASS의 멤버 인 경우 펑키'* ((CLASS *) this)가 무엇입니까? – chris

+0

내가 말했듯이, 컴파일러는'* this'를 사용할 때 그것을 좋아하지 않았기 때문에 나는 그것을 행복하게 만들었습니다. – Pochi

+2

오, 그럴 필요는 없습니다. 아마도'set' 함수는 오류가있는 곳에서 볼 가치가 있습니다. 사실'CLASS & right'가'const class & right'에 문제가 있습니까? – chris

답변

6

Visual Studio는 여기에 표준을 위반합니다.

오른쪽 인수는 임시이며 C++ 규칙에 따라 임시가 비 const 참조와 일치 할 수 없습니다.

+0

임시 정보는 수신자의 참조 정보와 일치해야합니다. 당신이 말하는 것은 무엇입니까 - 먼저 객체를 별도의 줄에 만들어야합니까? 나는 단지 호기심을 가지고 있지만, 표준에서 이것이 말하는 곳을 참조 할 수있는 기회가 있습니까? – Pochi

+0

음, 고칠 것 같아 ... 고마워! – Pochi

+0

임시 참조는 비 const 참조에 바인드 할 수 없습니다. MSVC는 컴파일 할 때 규칙을 위반하고 있다고 알려줍니다. 경고를보세요. –

1
당신은이 같은 operator| 뭔가 전화하는거야

:

int bit = 0x02; 
CLASS result = *this | (CLASS)bit; 

당신의 연산자는 참조를 걸립니다.

CLASS result = *this | (CLASS &)bit; 

또는 같은 연산자를 정의 :

CLASS CLASS::operator| (CLASS &&right); //C++11 

이 모두 올바른을 반환하는 원인이

CLASS CLASS::operator| (CLASS &right); 

내가 하나가 이런 식으로 호출 발견, GCC를 위해이 문제를 해결하려면 결과가 돌아왔다. 나는 하나 또는 다른 사람이 해결책다는 것을 보장 할 수 없다.

+0

그 중 두 개는 모두 옳은 것 대신에 '권리'를 수정하기 때문에 잘못되었습니다. –

+0

@MooingDuck, 내가 본 것에서 그것은 OP가 원했던 것입니다. – chris

+0

두 번째 것을 잘못 읽었습니다. 정상적으로 작동합니다. 그리고 저는 비트가 클래스라고 생각했습니다. 코드가 크게 달라졌을 것입니다.이 대답은 좋은 답변입니다. –