2012-04-01 8 views
-1
class apple 
{ 
    public : 
    operator orange() const { cout << "operator"; } 
} ; 
class orange 
{ 
    public : 
    orange (apple &x){cout <<"constructor";} 
}; 
void f(orange o) 
{ 
    cout <<"function can accept only oranges "; 
} 
int main() 
{ 
    apple a; 
    f(a); 
} 

출력 : 컴파일러 오류생성자를 호출 할 때 때 연산자 함수

왜이 코드는 g ++ 컴파일러에서 컴파일러 오류를 제공합니까? 함수 f가 호출 될 때 오렌지 생성자가 호출되지 않는 이유는 무엇입니까?

+3

질문에 오류 메시지를 추가하십시오. –

+0

operator +, operator-, operator = 및 많은 다른 연산자를 사용할 수 있지만 "operator orange"는 사용할 수 없습니다. – Imp

+5

@ 할 수 있는지 확인하십시오. –

답변

4

(난 정말 오렌지 :)에 사과 변환의 의미가 표시되지 않지만) 당신은 순환 종속성이. 어쨌든, 당신은 당신이 apple을 정의하기 전에 orange을 정의해야합니다, 당신은 운영자 orange 필요가 없습니다 :이 작업을해야

class apple; 
class orange 
{ 
public : 
    orange (apple &x){cout <<"constructor";} 
}; 
class apple 
{ 
public : 
}; 

합니다.

2

operator orange()은 값을 반환하지 않습니다. 변환 연산자의 모든 포인트는 유형 A에서 유형 B로 인스턴스를 변환하는 것입니다.

오렌지색 인스턴스를 생성하고 리턴해야합니다.

class apple 
{ 
public : 
    operator orange() const { cout << "operator"; } //depends on orange 
                //shouldn't compile 
} ; 
class orange 
{ 
public : 
    orange (apple &x){cout <<"constructor";} //depends on apple 
}; 

난 당신이 컴파일러 오류를받지 못하고있어 놀랍 :

+0

사실 void가 아닌 반환 유형이있는 함수에서 값을 반환하지 않는 것은 정의되지 않은 동작이다. –

+0

이것이 사실이지만 컴파일 오류의 원인이 아닙니다. –

+0

오류 : 라인 4에서 'orange'앞에 예상되는 타입 지정자. 사용하기 전에 오렌지를 정의하더라도 컴파일러 오류가 발생합니다. – Luv

관련 문제