Aracılığıyla paylaş


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 deletedtanı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 deletedtanımlar. Bu sorunu çözmek için bu üyeleri açıkça bildirmeniz gerekir.

ile bağlantılı olarak C2280 hatasını unique_ptrgö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 deletedbildirilir. 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 basetüretilir. Uyumlu kodda bu, üyelerine base erişilemez tophale 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
}