Derleyici Hatası C2280
'declaration': silinen bir işleve başvurmaya çalışıyor
Derleyici bir işleve başvurma deleted
girişimi algılamıştı. Bu hata, kaynak kodda açıkça olarak = deleted
işaretlenmiş bir üye işlevine yapılan çağrıdan kaynaklanabilir. Bu hata, derleyici tarafından otomatik olarak deleted
bildirilen ve olarak işaretlenen bir yapı veya sınıfın örtük özel üye işlevine yapılan çağrıdan da kaynaklanabilir. Derleyicinin otomatik olarak ne zaman veya deleted
özel üye işlevleri oluşturduğu default
hakkında daha fazla bilgi için bkz. Özel üye işlevleri.
Örnek: Açıkça silinen işlevler
Açıkça deleted
bir işlev çağrısı bu hataya neden olur. Açıkça deleted
üye işlevi, sınıfın veya yapının kullanımını önlemek için kasıtlı olarak tasarlandığını gösterir, bu nedenle bu sorunu gidermek için kodunuzu değiştirerek bunu önlemeniz gerekir.
// C2280_explicit.cpp
// compile with: cl /c /W4 C2280_explicit.cpp
struct A {
A();
A(int) = delete;
};
struct B {
A a1;
A a2 = A(3); // C2280, calls deleted A::A(int)
// To fix, remove the call to A(int)
};
void f() {
B b; // calls implicit B::B(void)
}
Örnek: Başlatılmamış veri üyeleri
Başlatılmamış başvuru türü veri üyesi veya const
veri üyesi, derleyicinin örtük olarak varsayılan bir deleted
oluşturucu bildirmesine neden olur. Bu sorunu düzeltmek için, veri üyesi bildirildiğinde başlatın.
// C2280_uninit.cpp
// compile with: cl /c C2280_uninit.cpp
struct A {
const int i; // uninitialized const-qualified data
// members or reference type data members cause
// the implicit default constructor to be deleted.
// To fix, initialize the value in the declaration:
// const int i = 42;
} a; // C2280
Örnek: Başvuru ve sabit veri üyeleri
Veya const
başvuru türü veri üyesi, derleyicinin bir deleted
kopyalama atama işleci bildirmesine neden olur. Başlatıldıktan sonra, bu üyelere atanamaz, bu nedenle basit bir kopya veya taşıma kullanılamaz. Bu sorunu düzeltmek için, hataya neden olan atama işlemlerini kaldırmak için mantığınızı değiştirmenizi öneririz.
// C2280_ref.cpp
// compile with: cl /c C2280_ref.cpp
extern int k;
struct A {
A();
int& ri = k; // a const or reference data member causes
// implicit copy assignment operator to be deleted.
};
void f() {
A a1, a2;
// To fix, consider removing this assignment.
a2 = a1; // C2280
}
Örnek: Taşınabilir, örtük kopyayı siler
Bir sınıf bir taşıma oluşturucu veya taşıma atama işleci bildirir, ancak açıkça bir kopya oluşturucu bildirmezse, derleyici örtük olarak bir kopya oluşturucu bildirir ve olarak deleted
tanımlar. Benzer şekilde, bir sınıf bir taşıma oluşturucu veya taşıma atama işleci bildirir, ancak açıkça bir kopyalama atama işleci bildirmezse, derleyici örtük olarak bir kopyalama atama işleci bildirir ve olarak deleted
tanımlar. Bu sorunu çözmek için bu üyeleri açıkça bildirmeniz gerekir.
ile bağlantılı olarak C2280 hatasını unique_ptr
gördüğünüzde, bunun nedeni neredeyse kesinlikle bir deleted
işlev olan kopya oluşturucusunu çağırmaya çalışmanızdır. Tasarım gereği, kopyalanamaz unique_ptr
. Bunun yerine sahipliği aktarmak için taşıma oluşturucu kullanın.
// C2280_move.cpp
// compile with: cl /c C2280_move.cpp
class base
{
public:
base();
~base();
base(base&&);
// Move constructor causes copy constructor to be
// implicitly declared as deleted. To fix this
// issue, you can explicitly declare a copy constructor:
// base(base&);
// If you want the compiler default version, do this:
// base(base&) = default;
};
void copy(base *p)
{
base b{*p}; // C2280
}
Örnek: Değişken ve geçici üyeler
Visual Studio 2015 Güncelleştirme 2 öncesi derleyici sürümleri, anonim birleşimler için uyumsuz ve varsayılan oluşturucular ve yıkıcılar oluşturmıyordu. Bunlar artık örtük olarak olarak deleted
bildirilir. Bu sürümler ayrıca üye değişkenleri olan sınıflarda ve yapılarda kopyalama ve taşıma oluşturucularının default
ve kopyalama ve taşıma atama işleçlerinin volatile
uyumlu olmayan örtük tanımına default
izin verdi. Derleyici şimdi bunları önemsiz olmayan oluşturuculara ve atama işleçlerine sahip olarak değerlendirir ve uygulama oluşturmaz default
. Böyle bir sınıf bir birleşimin üyesi veya bir sınıfın içinde anonim bir birleşim olduğunda, birleşim veya sınıfın kopya ve taşıma oluşturucuları ve kopyalama ve taşıma atama işleçleri örtük olarak tanımlanır deleted
. Bu sorunu çözmek için gerekli özel üye işlevlerini açıkça bildirmeniz gerekir.
// C2280_variant.cpp
// compile with: cl /c C2280_variant.cpp
struct A {
A() = default;
A(const A&);
};
struct B {
union {
A a;
int i;
};
// To fix this issue, declare the required
// special member functions:
// B();
// B(const B& b);
};
int main() {
B b1;
B b2(b1); // C2280
}
Örnek: Dolaylı temel üyeler silindi
Visual Studio 2015 Güncelleştirme 2'den önceki derleyici sürümleri uyumsuzdu ve türetilmiş bir sınıfın dolaylı olarak türetilmiş private virtual
temel sınıfların özel üye işlevlerini çağırmasına izin verdi. Derleyici artık böyle bir çağrı yapıldığında derleyici hatası C2280'i döndürür.
Bu örnekte, sınıfı top
dolaylı olarak özel sanaldan base
türetilir. Uyumlu kodda bu, üyelerine base
erişilemez top
hale getirir; türündeki top
bir nesne varsayılan olarak oluşturulamaz veya yok edilemez. Eski derleyici davranışına dayalı kodda bu sorunu düzeltmek için, türetme kullanmak protected virtual
için ara sınıfı değiştirin veya doğrudan türetme kullanmak için sınıfını değiştirin top
:
// C2280_indirect.cpp
// compile with: cl /c C2280_indirect.cpp
class base
{
protected:
base();
~base();
};
class middle : private virtual base {};
// Possible fix: Replace line above with:
// class middle : protected virtual base {};
class top : public virtual middle {}; // C4594, C4624
// Another possible fix: use direct derivation:
// class top : public virtual middle, private virtual base {};
void destroy(top *p)
{
delete p; // C2280
}
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin