2014-04-15 22 views
7

Yalnızca özel varsayılan kurucu ve ortak silinen kopya kurucusu içeren ve başka hiçbir şey içermeyen base sınıfına sahibim.Kopya kurucusu silinen bir sınıftan silindi

class base { 
private: 
    base() = default; 

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

ben base devralan ve aşağıdaki gibi sınıfın derived bir örneğini oluşturmaya çalışırsanız, g ++ 4.8.2 kodumu derlemek ama VC++ 2013 does değil.

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

derived x; 

Yani, g ++ veya VC++ 2013'te bir hata mı göz ardı ediliyor?

İşte

class base { 
private: 
    base() = default; 

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

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

derived x; 

int main() { 
} 

... komple kod ... ve g ++ hata mesajı. Sen hatayı misreading olan

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'te bir hata olduğunu iddia ediyorum. Kurucu özeldir ve bu nedenle sınıfın bir örneğini oluşturamazsınız. –

+0

Ancak, türetilen sınıflar sınıf tabanından miras kalmazsa, g ++ derlemesini sağlar. Varsayılan olarak varsayılan işaretçi varsayılan olarak örtülü olarak varsayılan yapıcıdır. – so61pi

+4

@ so61pi g ++'nın bu durumu teşhis etmemesi gerçeği [GCC hatası 56429] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429). – Casey

cevap

5

, derived için varsayılan yapıcı erişilemez olduğunu size anlatıyor bu türde bir nesne oluşturmak için kullanamazsın ki (private olduğunu). Şimdi derived seviyesinde public yapmak, base yapıcısı da private olduğundan ve bu nedenle derived yapıcısı içinde kullanılamaz.

Bu kurucuların neden private olmasını istiyorsunuz?

+0

VC++ 2013 & g ++: D kullanarak bazı C++ 11 özelliklerini test ettim. – so61pi

İlgili konular