2010-07-29 8 views
3

나는 내 자신의 SmartPointer 클래스가 있습니다.C++ 변환 연산자 오버로드 문제

는 SmartPtr는 기본 클래스에서 inherite 클래스를 포함하는 경우가 있으며, 나는이 작업을 수행 할 수있는 SmartPtr 변환 연산자를 오버로드하려고 SmartPtr<ClassX> into SmartPtr<BaseClassOfClassX>;

변환하고 싶습니다.

그것은 같은 클래스 스스로가,을 위해 잘 작동 :

template<class newType> 
operator SmartPtr<newType>() const 
{ 
    return SmartPtr<newType>((SmartPtr<newType>*)this); 
} 

하지만 클래스에 대한 포인터, 나는 다음을 시도하지, 그것은 전화를 가져옵니다 결코 다음과 같은 오류 얻을 :

SmartPtr<ClassX> test(pClassX); 
    SmartPtr<BaseClassOfClassX>* ob = &test; 

ERROR: 
cannot convert from 'SmartPtr<T> *' to 'SmartPtr<T> *' 

이 사람이 나의 두 번째 잘못이 무엇인지 볼 수 있습니까 :

template<class newType> 
operator SmartPtr<newType>*() const 
{ 
     return static_cast<SmartPtr<newType>*>(this); 
} 

간단한 코드 오류를 얻을 수 있습니다 전환 과부하? 감사

은 C++ 표준에서

답변

0

"조작자 활동한다 어느 비 정적 멤버 함수이거나 비 멤버 함수이어야하며, 그 종류의 클래스는 클래스 참조 적어도 하나 개 파라미터를 열거 나 &test의 유형으로 열거. "

에 대한 참조는 클래스와 클래스로 암시 적으로 변환 아무것도 아닌, 직접 포인터의 타입 변환에 과부하 수 없습니다. 왜 스마트 포인터에 대한 포인터가 필요한지에 따라 훨씬 더 보편적 인 참조를 사용하고 싶을 수도 있습니다.