자,이 문제에 대해 들었습니다 : 파생 클래스에 대한 포인터를 던져서 기본 포인터를 잡을 수있는 이유는 무엇입니까?하지만 shared_ptrs로는 그렇게 할 수 없습니까?C++ : base의 derived_ptr을 파생하고 catch하는 중 shared_ptr을 가져 오는 중입니까?
class Base {};
class Derived : public Base {};
int main()
{
try
{
throw new Derived() ;
}
catch(const Base2 * b)
{
printf("Received a base") ;
}
return 0 ;
}
을하지만이
int main()
{
try
{
throw std::tr1::shared_ptr<Derived>(new Derived()) ;
}
catch(const std::tr1::shared_ptr<Base> & b)
{
printf("Received a base") ;
}
return 0 ;
}
어떤 아이디어를하지 않는 :
예,이 작품? 그래서 템플릿이 명시 적으로 제공하지 않는 다른 하나로부터 암시 적 변환이 없습니다 derived
이 base
관련이 경우에도, shared_ptr<derived>
는 shared_ptr<base>
관련이 없습니다 (같은 본질적으로 다른를 적용 :
내 생각에 예외 처리기가 신경 쓰는 한'shared_ptr '은'shared_ptr '의 서명과 일치하지 않을 것입니다. –
왜 throw/catch와 함께 포인터를 사용하고 있습니까? 나쁜 습관입니다. – Torsten
나는 이것이 가능할 방법을 볼 수 없다. 본문과 핸들러 std :: 함수를 사용하여 함수를 래핑하지 않아도 일반적으로 구성 할 수 있습니다. 일반적으로 catch 할 수 없습니다. – sehe