2012-06-26 2 views
2

변환을 완전히 이해하고 싶습니다. 즉, 함수 호출이 암시 적 변환을 수행하는시기와 컴파일 오류의 원인을 확실히 알고 싶습니다.변환 및 상향 교환

1. Exact match 
2. Promotion 
3. Conversion 
4. User defined conversion 

, 방법 (우선 순위에 따라 분류) 다음 목록에서 최대 두 단계로 변수를 변환하는 유일한 방법이 경우만 나는 변환 할 수 있다는 것을 배웠다 나는 그것을 이해했다 (당신이 나를 고칠 수도있다). 프로모션은 기본에서 int로, float에서 double로와 같은 더 큰 기본 유형으로의 변환이다. 변환은 프로모션이 아닌 프리미티브 (예 : int, char 등) 간의 모든 변환입니다. 사용자 정의 변환은 변환 생성자와 변환 연산자를 사용하여 클래스를 변환하는 것입니다. 이제는 상속 의미와 Is-A 관계가 있다는 것을 알고 있습니다. 파생 클래스가 기본 클래스이기 때문에 기본 클래스에 대한 참조가 필요한 함수에 파생 클래스를 보내면됩니다. D는 INT에서로 변환 할 수 있으며, D는 C.이기 때문에

class C {}; 
class D: public C 
{ 
public: 
D(int x){} 
}; 
void f(C& c) {} 
f(3); 

하지만이 코드는되지 않는 : 위의 두 개념을 결합, 우리는 내가 쓴 다음 예제는 작동해야 얻어야한다 컴파일. 왜 그런가요? 모순은 어떻게 해결 될 수 있습니까? 이 문제에 대해 밝힐 수 있습니까? 감사!

답변

4

코드 변환시 비 -참조에 바인드 할 수없는 임시 변환이 생성되므로 코드가 컴파일되지 않습니다.

매개 변수를 const 참조 (또는 값으로 전달하지만 사용자가 제안하지는 않음)로 전달하면 작동합니다.

또한 기본 클래스에 변환 생성자가 필요합니다 (아래 설명 참조).

class C { 
public: 
   C(int x){} 
}; 
class D: public C 
{ 
public: 
   D(int x):C(x){} 
}; 

void f(const C& c) {} 
f(3); 

암시 적 변환이 단지 하나의 시간 최대 적용하기 때문이다. 귀하의 경우에는 int -> D에서 직접 변환이 있고 D -> C에서 변환하는 것이므로 intC으로 암묵적으로 변환 될 수 없습니다.

+0

@Als 기본 클래스가 표시되지 않았습니다. 기본 클래스에 변환 코드가 있으면 해당 코드가됩니다. –

+0

당신은 const 일에 대해 완전히 맞습니다. 하지만 "암시 적 변환은 최대 한 번만 적용됩니다"에 대한 확신이 있습니까? 내 암시 적 변환이 최대 두 번 적용된다는 것을 배웠습니다. – nodwj

+0

@ 아이 단 예. 그것은 (논리적으로) 불가능합니다. 1보다 큰 제한은 모호함을 초래합니다. –

관련 문제