2010-04-21 19 views
7

我得到一個錯誤,指出:寬鬆的投符在C++

錯誤:寬鬆扔說明符 '虛擬CPLAT :: CP_Window ::〜CP_Window()'

在析構函數,我有從來沒有聽說過這一點,一些谷歌搜索稱這可能是一個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();' 現在,如果我將它用作我自己異常的基礎,我必須在每個派生類中聲明一個desctructor類,即使在這個析構函數中沒有什麼可做的,因爲如果我不這樣做,gcc會抱怨。有沒有辦法避免這種多餘的聲明? – 2010-09-02 13:28:44

+2

不是我所知道的,如果沒有別的,因爲它在技術上不是多餘的。如果你沒有定義析構函數,你會得到一個沒有拋出說明符的。所以它有錯誤的功能簽名。您必須通過使用空throw指定符來定義正確的函數簽名:'throw()'。如果編譯器爲你做了這件事,那會很好,但這顯然不是那麼聰明。 – 2010-09-02 13:49:58

+0

感謝您的評論。 – 2010-09-02 14:07:38