class A
{
public:
virtual ~A()
{
}
};
class B : virtual public A
{
public:
~B() throw()
{}
};
class C : public B
{
};
int main(int argc, char * argv [])
{
return 0;
}
該代碼提供了以下錯誤:GCC異常規範
error: looser throw specifier for ‘virtual C::~C()’
error: overriding ‘virtual B::~B() throw()’
在我的Debian測試(GCC(Debian的4.6.0-10)4.6.1 20110526(搶鮮)),但編譯在以前的gcc版本上沒有錯誤(再次在我的debian系統上使用4.5)。
How does an exception specification affect virtual destructor overriding? 根據這個答案,編譯器應該創建一個匹配基類的throw聲明的默認構造函數。很明顯,這不是新gcc上發生的事情。什麼改變了,什麼是正確的編譯器行爲,除了在派生類中手動添加空的析構函數(例如編譯器標誌)之外,還有一些簡單的解決方案。
這是實際的代碼嗎?如果你跳過了一個成員聲明,那可以改變結果。另外,您是否指定了C++ 11支持?規則稍微改變了析構函數,雖然代碼仍然可以,但在某處可能會有錯誤。 –
不,這不是實際的代碼。我可以說,因爲它至少有一個語法錯誤。 @Yordan,請在提問時發佈實際的,可編譯的代碼。有關如何做到這一點的細節以及爲什麼它很重要,請參閱http://sscce.org。 –
@Rob - O.o你一定是在開玩笑..?這不是一個複雜而又冗長的源代碼的問題,這些東西很重要。兩個明顯的分號丟失,這不會改變問題,信息,環境,任何事情。 –