C++ 11'in yapıcı devralma özelliğini kullanmaya çalışıyorum. (Ben nereden hatırlamıyorum bir yerden kopyalanmış) Aşağıdaki pasajı tamamen iyi çalışır:Kopyalama kurucusu silme, devralınan yapıcılar
comment damgasını hat eklenene kadar olduğu#include <iostream>
struct Base {
Base() : Base(0) {}
Base(int a) : Base(a, 0) {}
Base(int a, double b) { std::cout << "Base(" << a << "," << b << ")" << std::endl; }
};
struct Derived : Base {
using Base::Base;
Derived(const Derived& that) = delete; // This line is the culprit
};
int main(int argc, char* argv[]) {
Derived d1;
Derived d2(42);
Derived d3(42, 3.14);
}
; Sonra çünkü her şey gevşek tatili: Ayrıca her nasılsa ulaşılmaz Base
varsayılan yapıcısı yapılan kopya kurucu silme sanki
> g++ -std=c++11 -o test test.cpp
test.cpp: In function ‘int main(int, char**)’:
test.cpp:18:11: error: no matching function for call to ‘Derived::Derived()’
Derived d1;
^
test.cpp:18:11: note: candidates are:
test.cpp:13:16: note: Derived::Derived(int)
using Base::Base;
^
test.cpp:13:16: note: candidate expects 1 argument, 0 provided
test.cpp:13:16: note: Derived::Derived(int, double)
test.cpp:13:16: note: candidate expects 2 arguments, 0 provided
görünüyor. Sorunun giderilmesi faydalı bir şey getirmedi; SO this issue önerdi, ancak anladığım kadarıyla, bu snippet'te kopya başlatma kullanmıyorum. Burada olanlara biraz ışık tutabilir mi?
(yukarıda, mesajı üreten derleyici GCC 4.8.2 olduğu;. Bununla birlikte, çınlama benzer bir hata mesajı döndürür)
Varsayılan kurucu devralınmamış. –
T.C. Nasıl yani? "Türetilmiş d1" satırında, açıkça 'Base()' yi görüyorum. –
@ T.C. kelimelerin seçimi yanıltıcıdır. Elbette, kurucular devralınırlar - aksi takdirde, bunları türetilmiş sınıftan arayamazsınız. Sadece farklı sınıf için kullanılır. – SergeyA