şablonları kullanırken eksik varsayılan kurucu

Kendi üye işlevlerinin bazılarında işlev nesnelerini kullanan bir sınıf şablonu kullanarak bir sorunumuz var. VS2010 derleyici aşağıdaki hata iletisidir:

hata C2512: 'SimpleFunctor :: SimpleFunctor': uygun varsayılan yok   yapıcı kullanılabilir

Bunu çoğaltmak için küçültülmüş kod şöyledir:

//myfunctor.h

class SimpleFunctor
{
  private:
    SimpleFunctor( const SimpleFunctor& );
    SimpleFunctor& operator=( const SimpleFunctor& );
  public:
    bool operator()() { return true; }
}; 

//mytemplate.h

#include "myfunctor.h"

template< typename T >
class Test
{
  private:
    Test( const Test& );
    Test& operator=( const Test& );
  public:
    Test(){}

    void testFunction( T parameter )
    {
      bool result = SimpleFunctor()();
    }
};

//main.cpp

#include "HK_Template.h"

int main()
{
  Test< int > obj;
  obj.testFunction( 5 );

  return 0;
}

Bu örnekler, SimpleFunctor gibi varsayılan kurucuyu eklediğinden beri doğru olan yukarıdaki hata iletisini üretir:

SimpleFunctor() {}

hatayı düzeltir.

Yani soru şu ki, derleyici neden varsayılan kurucuyu üretmiyor?

1
Çok iyi bir soru için +1
katma yazar e.James, kaynak

2 cevap

Bir kopya oluşturucu dahil, herhangi bir kurucuyu kendiniz tanımladığınızda, derleyici artık bir varsayılan kurucu oluşturmaz.

(Diğer yandan, bir kural sağlamazsanız, belirli kurallara tabi olarak varsayılan olarak bir kopya/taşıma yapıcısı oluşturulur.)

5
katma
Aw, aynı cevabı vermek üzereydim! +1 benden.
katma yazar sbi, kaynak
Tam olarak ve sadece bazı şeyleri açıklığa kavuşturmak için, bu davranışın şablonlarla ilgisi yoktur, genel bir C ++ kuralıdır.
katma yazar Randall Flagg, kaynak

Derleyici, tanımlamıyorsanız yalnızca varsayılan bir kurucu sağlar. herhangi bir kurucu. Kullanıcı tanımlı bir kopyasını bildirdiğinizden kurucu, derleyici bunu sağlamaz.

Kopyalama kurucusunun bildirilmesinin tek nedeni şu şekildedir: Özel yapmak ve böylece devre dışı bırakmak. Bu durumda, daha iyi çözüm, boost :: noncopyable öğesinden devralmak olabilir. Aynı etki, ancak derleyicinin varsayılan kurucu.

0
katma
@Als Sadece derleyiciniz C ++ 11'i destekliyorsa mümkündür. Çoğu geliştirici için bir seçenek değil.
katma yazar James Kanze, kaynak
Veya alternatif olarak, kopya kurucusunu açıkça silebilirsiniz .
katma yazar Alok Save, kaynak