2014-04-15 114 views
7

我有類base其中只包含私有默認構造函數和公共刪除拷貝構造函數,沒有別的。從具有刪除拷貝構造函數的類繼承

class base { 
private: 
    base() = default; 

public: 
    base(const base&) = delete; 
}; 

如果我嘗試從base繼承和創建如下derived類的一個實例,G ++ 4.8.2不編譯我的代碼,但VC++ 2013呢。

class derived : public base { 
private: 
    derived() = default; 
}; 

derived x; 

那麼,這是g ++或VC++ 2013中的一個錯誤只是忽略了一些東西?

下面是完整的代碼...

class base { 
private: 
    base() = default; 

public: 
    base(const base&) = delete; 
}; 

class derived : public base { 
private: 
    derived() = default; 
}; 

derived x; 

int main() { 
} 

...和g ++錯誤消息。

main.cpp:12:5: error: 'constexpr derived::derived()' is private 
    derived() = default; 
    ^
main.cpp:15:9: error: within this context 
derived x; 
     ^
main.cpp: In constructor 'constexpr derived::derived()': 
main.cpp:3:5: error: 'constexpr base::base()' is private 
    base() = default; 
    ^
main.cpp:12:5: error: within this context 
    derived() = default; 
    ^
main.cpp: At global scope: 
main.cpp:15:9: note: synthesized method 'constexpr derived::derived()' first required here 
derived x; 
     ^
+8

我會認爲這是VS2013中的一個錯誤。構造函數是私有的,因此您不能創建該類的實例。 –

+0

但是,如果派生類不從類庫繼承,g ++將讓它編譯。也許默認構造函數標記爲default就像隱式聲明的默認構造函數一樣。 – so61pi

+4

@ so61pi g ++不會診斷這種情況的事實是[GCC bug 56429](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429)。 – Casey

回答

5

你誤讀的錯誤,這是告訴你,對於derived默認的構造函數是無法訪問的(是private),因此你不能用它來創建一個該類型的對象。因爲base的構造函數也是private,因此不能在derived的構造函數中使用,因此將其設置爲publicderived級別將無濟於事。

爲什麼你要那些構造函數爲private

+0

我剛剛使用VC++ 2013&g ++:D測試了一些C++ 11功能。 – so61pi