2015-06-01 44 views
9

Bu örnek derler ve gcc 4.8.3 ile iyi çalışır silinir). Visual Studio 2013 ile bu mümkün değil mi? Ya da benim örnek kodum yanlış ve gcc benim hatamı görmezden mi geliyor?unique_ptr yapıcı

hata olduğu:

main.cpp (8): hata C2280: 'std :: unique_ptr> :: unique_ptr> (_ Ptr2, _Dx2)': ile silinmiş işlev referans teşebbüs [ _Ptr2 = const char *, _Dx2 = ana :: ] C: \ Program Dosyaları (x86) \ Microsoft Visual Studio 12.0 \ VC \ INCLUDE \ bellek (16 16): 'std :: unique_ptr> bildirgesine bakın: : unique_ptr '

+0

Clang ile çalışır. –

+3

"Neden" 'std :: function'' nu 'unique_ptr' olarak algılamak korkunç bir fikir kullanıyor? –

+0

[OT]: Hiçbir şey yakalamadığınız için, gereksizdir = = in [=] '. – Jarod42

cevap

6

Bu bir Visual C++ 2013 standart kitaplığında hata. Ben unique_ptr sınıf bir işaretçi ve bir deleter ayırdığınız için bu kurucu sahiptir 2015

sorunu yeniden yapamazsınız:

template<class _Ptr2, 
    class _Dx2> 
    unique_ptr(_Ptr2, _Dx2) = delete; 
: Ancak

unique_ptr(pointer _Ptr, 
    typename _If<is_reference<_Dx>::value, _Dx, 
     const typename remove_reference<_Dx>::type&>::type _Dt) _NOEXCEPT 
    : _Mybase(_Ptr, _Dt) 
    { // construct with pointer and (maybe const) deleter& 
    } 

, unique_ptr<T[]> uzmanlaşma da tümünü yakalama Oluşturucu sahip

Bu sürüm bir öncekine göre tercih edilir.

Ancak uzman olmayan unique_ptr bir const char yerine const char[] ait düzeltmelere sorunu u_ptr değişen, hiç sahip olmadığı için. Eğer yapıyoruz gibi bir deleter ile dizi sürümünü kullanarak

da gereksizdir:

  1. Eğer pointer üzerinde delete[] aramak isterseniz, zaten diziler için bir uzmanlaşma var. Özel bir deletere ihtiyacınız yok.

  2. Başka bir şey yapmak isterseniz, özelleştirilmiş olmayan sürümü kullanmalısınız.

+0

as 'Std :: unique_ptr 'sorusu üzerine yaptığım yorumdan da bahsetmiştim. Burada özel bir deliciye gerek yok. – Mgetz

+1

@Mgetz, OP kodunun sözdizimsel olarak doğru olup olmadığını soruyor (Ve neden derleyiciler katılmıyor). Halihazırda uygun bir delicinin varlığı ilgisizdir, çünkü bir [MCVE] (http://stackoverflow.com/help/mcve) sağladı ve gerçek asıl problemde özel bir deletici kullanması gerekebilir. –