2010-04-21 19 views
7

sto ottenendo un errore che dice:looser tiro specificatore per in C++

errore: looser tiro specificatore per 'virtuale CPLAT :: :: CP_Window ~ CP_Window()'

Sul distruttore, ho non ne ho mai sentito parlare prima e alcune ricerche di Google dicono che potrebbe trattarsi di un problema di GCC 4, che non sarei sicuro di come risolvere perché ho bisogno di GCC 4 per costruire un binario universale.

Ambiente personale: OS X 10.6, XCode 3.2.2, GCC 4 per creare un binario universale.

Qual è il problema?

risposta

12

Suppongo che CPLAT abbia una classe base? Immagino anche che non hai inserito un identificatore di lancio sul distruttore di CPLAT?

È possibile inserire throw(X) (dove X è un elenco di eccezioni separato da virgole) alla fine della firma di una funzione per indicare quali eccezioni è consentito lanciare. Se si specifica throw() come identificatore di lancio, ciò indica che nessuna eccezione può essere generata da tale funzione. È abbastanza comune farlo con i distruttori poiché non si desidera mai che un distruttore lanci un'eccezione.

Una classe che esegue l'override di una funzione che ha un identificatore di lancio non può avere un identificatore di lancio più flessibile (elenca più eccezioni) rispetto alla funzione sovrascritta, poiché ciò indicherebbe che la funzione di classe derivata potrebbe violare lo specificatore di lancio della base funzione di classe Non avere un identificatore di lancio significa che qualsiasi eccezione può essere generata da quella funzione, quindi è lenta quanto può ottenere.

Con ogni probabilità, è necessario aggiungere throw() alla fine della firma della funzione del distruttore di CPLAT.

Edit: A proposito, ho probabilmente dovrebbe aggiungere che probabilmente non si desidera utilizzare specificatori throw (diverse da quelle su throw() distruttori) senza sapere che questo è ciò che si desidera. A differenza delle eccezioni controllate di Java, non vengono catturate in fase di compilazione, ma piuttosto terminano il programma in fase di esecuzione se violate. Quindi, è meglio non usarli se non sai cosa stai facendo.

+2

La mia implementazione stl dichiara std :: exception's destructor as '~ exception() throw();' Ora se vado a utilizzarlo come base per le mie eccezioni, devo dichiarare un descrittore in ogni derivato classe anche se non c'è nulla da fare in quel distruttore perché se non lo faccio, gcc si lamenta. C'è un modo per evitare questa dichiarazione ridondante? –

+2

Non che io sappia, se non altro, perché tecnicamente non è ridondante. Se non si definisce un distruttore, ne si ottiene uno che non ha identificatori di lancio. Quindi, ha la firma della funzione sbagliata. Devi dargli la firma della funzione corretta definendola con un identificatore di lancio vuoto: 'throw()'. Sarebbe bello se il compilatore lo facesse per te, ma a quanto pare non è così intelligente. –

+0

Grazie per il commento. –

Problemi correlati