2014-04-15 25 views
7

Mam klasy base, który zawiera tylko prywatny konstruktor domyślny i publiczny konstruktor kopii usunięte i nic więcej.Dziedziczy z klasy, która ma konstruktora kopii usunięty

class base { 
private: 
    base() = default; 

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

Gdy próbuję dziedziczą base i utworzyć instancję klasy derived jak poniżej, g ++ 4.8.2 nie kompiluje mojego kodu ale VC++ 2013 robi.

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

derived x; 

Czy to błąd w g ++ lub VC++ 2013 po prostu zignorował coś?

Oto kompletny kod ...

class base { 
private: 
    base() = default; 

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

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

derived x; 

int main() { 
} 

... g ++ i komunikat o błędzie.

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

Twierdzę, że to błąd w VS2013. Konstruktor jest prywatny i dlatego nie można utworzyć instancji klasy. –

+0

Ale jeśli klasa pochodna nie dziedziczy po bazie klasy, g ++ pozwoli jej się skompilować. Być może domyślny konstruktor oznaczony jako domyślny jest tak jak domyślnie domyślny konstruktor. – so61pi

+4

@ so61pi Fakt, że g ++ nie zdiagnozuje tego przypadku, to [błąd GCC 56429] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429). – Casey

Odpowiedz

5

Jesteś błędnej błąd, to jest informacją, że konstruktor domyślny dla derived nie jest dostępne (jest private) tak, że nie można używać, aby utworzyć obiekt tego typu. Teraz ustawienie public na poziomie derived nie pomoże, ponieważ konstruktor base jest również private i dlatego nie może być używany w konstruktorze derived.

Dlaczego ten konstruktor ma być private?

+0

Właśnie przetestowałem niektóre funkcje C++ 11, używając VC++ 2013 i g ++: D. – so61pi