Shablonlar ishlatilayotganda standart konstruktor yo'q

Biz o'z a'zolarining ayrim funktsiyalarida funktsiya moslamalarini ishlatadigan sinf shablonini ishlatib, muammolarimiz bor. VS2010 kompilyatorining xato xabari quyidagilardan iborat:

xato C2512: "SimpleFunctor :: SimpleFunctor": mos bo'lmagan standart   ijodkor mavjud

Buni ko'paytirish uchun kodeks kodi quyidagicha:

//myfunctor.h

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

//mytemplate.h -ni tanlang

#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;
}

Ushbu misollar yuqoridagi xato xabarni ishlab chiqaradi, chunki quyidagi kabi SimpleFunctor-ga standart konstruktor qo'shilgandan so'ng to'g'ri ko'rinadi:

SimpleFunctor() {}

xatolikni tuzatadi.

Shunday qilib, savol nima uchun derleyici asl konstruktorni yaratmaydi?

1
Juda yaxshi taklif etilgan savol uchun +1
qo'shib qo'ydi muallif e.James, manba

2 javoblar

Agar biron-bir konstruktordan o'zingizni, shu jumladan, nusxalashni yaratuvchi, o'z ichiga olgan holda, derleyici, asl qiymati ishlab chiqaruvchi hosil qilmaydi.

(Boshqa tomondan, bir nusxa ko'chirish/ko'chirish konstruktörü , , bir xil qoidalarga bo'ysunmasangiz, sukut bo'yicha ishlab chiqarilgan.)

5
qo'shib qo'ydi
Ha, men ham xuddi shunday javobni bajarishga tayyorman! Menga +1 .
qo'shib qo'ydi muallif sbi, manba
Haqiqatan ham, aniq narsani tushunish uchun, bu xatti-harakatlar shablonlarga aloqasi yo'q, umumiy C ++ qoidasi
qo'shib qo'ydi muallif Randall Flagg, manba

Siz aniqlamagan holda derleyici faqat standart konstruktorni taqdim etadi har qanday konstruktorlar. Siz foydalanuvchi tomonidan belgilangan nusxani e'lon qilganingiz uchun quruvchi, derleyici buni bermaydi.

Nusxa ko'chirish konstruktorini e'lon qilayotganingizning sababi shundadir uni xususiy qilish va shu bilan uni o'chirish. Bunday holatda yaxshiroq echimini boost :: noncopyable dan egallash mumkin bir xil ta'sir qiladi, lekin derleyici ishlab chiqarishni to'xtatmaydi default constructor.

0
qo'shib qo'ydi
@Als faqat sizning kompilyatoringiz C ++ 11 ni qo'llab-quvvatlasa mumkin. Aksariyat dasturchilar uchun imkoniyat yo'q.
qo'shib qo'ydi muallif James Kanze, manba
Yoki muqobil ravishda nusxalashni tashkil qiluvchini aniqroq o'chirib yuborishingiz mumkin.
qo'shib qo'ydi muallif Alok Save, manba