2010-04-21 5 views
7

에 나는 말한다 오류가 점점 오전에 대해 :느슨한 던져 지정자 C++

오류 : 대한 느슨한 던져 지정자 '가상 CPLAT :: CP_Window :: ~ CP_Window() 소멸자에

, 내가 가진 전에 이것을 들어 보지 못했고 일부 Google 검색은 이것이 GCC 4 문제 일 수 있다고 말합니다.이 문제는 유니버설 바이너리를 작성하기 위해 GCC 4가 필요하기 때문에 해결 방법을 모르겠습니다.

내 환경 : OS X 10.6, XCode 3.2.2, 범용 이진을 작성하는 GCC 4.

무엇이 문제입니까?

답변

12

CPLAT에 기본 클래스가 있다고 가정합니까? CPLAT의 소멸자에 throw 지정자를 넣지 않았다고 추측하고 있습니까?

throw(X) (여기서 X는 쉼표로 구분 된 예외 목록 임)을 함수의 서명 끝 부분에 넣을 수 있습니다. 예외는 throw 할 수있는 예외를 나타냅니다. 던지기 지정자로 throw()을 입력하면 해당 함수에서 예외를 throw 할 수 없음을 나타냅니다. 소멸자가 예외를 던지길 원하지 않기 때문에 소멸자와 함께하는 것이 일반적입니다.

throw 지정자가있는 함수를 재정의하는 클래스는 재정의 할 함수보다 더 느슨한 지정자 (더 많은 예외 목록 표시)를 가질 수 없습니다. 이는 파생 클래스의 함수가 기본의 throw 지정자를 위반할 수 있음을 나타 내기 때문입니다 클래스 '함수. throw 지정자를 가지지 않으면 예외가 그 함수에서 발생 될 수 있다는 것을 의미하므로 얻을 수있는만큼 느슨합니다.

CPLAT의 소멸자 기능 서명 끝에 throw()을 추가해야합니다.

편집 : 그런데, 나는 아마 당신은 아마 정말 당신이 원하는 무엇을 모르고 (소멸자에 throw() 제외) 던져 지정자를 사용하지 않을 것을 추가해야합니다. Java의 검사 된 예외와 달리 컴파일 타임에 잡히지 않고 실행 시간에 프로그램을 종료합니다. 그래서, 당신이하고있는 것을 알지 않는 한 그것을 사용하지 않는 것이 가장 좋습니다.

+2

내 stl 구현은 std :: exception의 소멸자를 '~ exception() throw(); '으로 선언한다. 이제 내가 이것을 내 자신의 예외에 대한 기반으로 사용한다면, 나는 파생 된 모든 것에 desructructor를 선언해야한다. 비록 소멸된다면 gcc는 불평 할 것이기 때문에 그 소멸자에서 할 일이 없어도 클래스를 사용할 수 있습니다. 이 중복 된 선언을 피할 수있는 방법이 있습니까? –

+2

기술적으로 중복되지 않기 때문에 내가 아는 것은 없습니다. 소멸자를 정의하지 않으면 throw 지정자가없는 것을 얻습니다. 따라서 잘못된 함수 서명이 있습니다. 비어있는 throw 지정자 인'throw()'를 사용하여 올바른 함수 시그니처를 정의해야합니다. 컴파일러가 당신을 위해 그렇게했다면 좋겠지 만 분명히 똑똑하지는 않습니다. –

+0

의견을 주셔서 감사합니다. –