2014-09-30 29 views
5

içeren std :: vektör yapıları ile bir sınıf bildirilirken hata C# ile birkaç yıl çalışmış olmasına rağmen, C++ 'da bazı şeyler yapmak benim için bazen zor. Akıllı göstergelerin kullanımını tamamen benimsiyorum, ancak şu anda aşağıdaki bulmaca ile karşılaşıyorum:std :: unique_ptr

Yapı Foo, örn. Farklı sınıfta

struct Foo 
{ 
    Foo(std::unique_ptr<Bar> bar) : m_myBar(std::move(bar)) {} 

private: 
    std::unique_ptr<Bar> m_myBar;   
}; 

, ben Foo örneklerini içeren bir vektör olsun istiyorum, ama

std::vector<Foo> m_Foos; 

verimleri derlemek aşağıdaki satır hataları kopya yapıcı silinir söyleyerek. SO iş parçacığı "Why can I not push_back a unique_ptr into a vector?" bir açıklama yanı sıra bir açıklama verilir. Bununla birlikte, burada benzersiz bir işaretçi içeren bir vektöre sahipken, benzersiz bir işaretçinin vektörü ile ilgili soru var. Önerilen çözüm, hareket anlambilim kullanmaktır, ancak bu durum benim durumumda nasıl geçerlidir? Yoksa başka bir şey mi yapmalıyım?

+0

Visual Studio mu kullanıyorsunuz? – Angew

+0

Hayır, Qt Creator 3.1.2 kullanarak Qt 5.3.1 tabanlı mingw32-make.exe ile kullanıyorum. Önemi var? – SimonAx

+0

Hangi derleyici? Tamam, mingw gcc'yi farz ediyorum. Visual Studio'nun derleyicisi otomatik olarak hareket ctors oluşturamaz. Ama vektör hattının kendisi hataya neden olmaz, cevabımdaki bağlantıya bakın. Belki de bu sınıfın kopya cetvelini etkileyen bir sınıfa dahil mi? IOW, lütfen bir [MCVE] (http://stackoverflow.com/help/mcve) gönderin. – Angew

cevap

4

, m_Foos aslında başka bir sınıfın bir veri üyesidir (bunu FooHolder arayacağım). FooHolder için bir kopya oluşturucu sağlamazsanız, derleyici otomatik olarak bir tane oluşturur. Bu kopya kurucusu, m_Foos da dahil olmak üzere FooHolder'un tüm veri üyelerinin kopya yapıcılarını arayacaktır. Tabii ki, std::vector<Foo>'un kopya kurucusu Foo kopyalanamaz olduğundan bir derleme hatası içeriyor. Bu muhtemelen hatayı almanızın sebebi.

FooHolder için uygun bir kopya oluşturucuyu, eğer bu sınıfın kopyalanabilmesini istiyorsanız isteyebilirsiniz. Aksi takdirde, kopya oluşturucusunu silinecek bir taşımayı (muhtemelen varsayılan olarak) bildirebilirsiniz:

struct FooHolder 
{ 
    FooHolder(FooHolder&&) = default; 

private: 
    std::vector<Foo> m_Foos; 
}; 
+0

OP hala 'Foo' foo 'kopya-yapılandırılabilir değil,' it '' lOffue '' için çalışırken çalışırken hata olabilir, bu –

+0

@ PiotrS bahsetmeye değer. OP, hatanın vektör tanımından geldiğini iddia ediyordu - öyle değildi. Ve cevap, yapının kendisini de taşımaya yöneldi. – Angew

+0

Kerrek'in –

1

Benzersiz işaretçileri kopyalayamazsınız. Yalnızca taşıyabilirsiniz edebilirsiniz:

Dediğiniz gibi
Foo(std::unique_ptr<Bar> bar) : m_myBar(std::move(bar)) {} 
//          ^^^^^^^^^^^^^^ 
+0

@angew ve Kerrek. Ben yazamayacağına işaret ettiğin için teşekkürler: -s Benim asıl soruda, her ikisini de bahsettiğin std :: hareketini kullanmamı unuttum. Orijinal sorumu bunu yansıtmak için güncelledim. Std :: vector m_Foos satırını silerken, program derler ve Foo nesnelerini bile oluşturabilirim, bu yüzden vektörün soruna neden olduğundan eminim. – SimonAx

+0

@SimonAx: vektör üzerinde hangi işlemleri gerçekleştiriyorsunuz? ve bu diğer sınıfı std :: vector' ile kopyalamaya çalışıyor musunuz? –

+0

@PiotrS. Henüz vektör üzerinde herhangi bir işlem yapmadım. Geriye doğru itme öğeleriyle devam etmeden önce, programın derlendiğini ve bunu yapmadığını doğrulamak istedim. – SimonAx

İlgili konular