2016-03-31 15 views
1

İşte benim kodum: sonuç 1,2,3,4,5,6 olmalı, ama hala 1,2,3,1,2,3 olmalıdır. Ben linux üzerinde çalıştırdığımda, bu doğru. Bana gerçeği söyleyebilir.referans alarak functor'lar, VS2012'de çalıştırıyorum, neden hata yapıyor?

class IntSequence { 
private: 
    int value; 
public: 
    IntSequence(int initialValue) : value(initialValue){} 
    int operator()() { 
     return value++; 
    } 
}; 
int main() 
{ 

    list<int> coll; 
    IntSequence seq(1); 
    generate_n<back_insert_iterator<list<int> > , int , IntSequence& > 
     (back_inserter(coll) , 3 ,seq);//result is 1,2,3 
    generate_n (back_inserter(coll) , 3 ,seq);//result should be 1,2,3,4,5,6,but it is still 1,2,3,1,2,3 
} 

cevap

3

Kullanım std::ref, aksi generate_n, yeni IntSequence functor oluşturmak onun değer artış ve sonra onu yok edecek. görsel stüdyoda çalışmıyor neden

http://ideone.com/pBHum1

list<int> coll; 
IntSequence seq(1); 

generate_n (back_inserter(coll), 3, std::ref(seq)); 
generate_n (back_inserter(coll), 3, std::ref(seq)); 

for (auto& i : coll) 
    cout << i << " "; 

Açıklama:

VS2015 ise

(ve sizin durumunuzda 2012), generate_n bir iç özel fonksiyon _generate_n kabul etmez çağrıları bir yönlendirme referansı veya bir referans. Bunun yerine, tekrar _Fn değerini kabul eder.

Bu nedenle, şablon argümanlarını açıkça belirleyerek bir referansı doğru bir şekilde iletmiş olsanız bile, _generate_n numaralı telefonu arayın.

Bunun bu şekilde olması gerekip gerekmediğini bilmiyorum. Ama muhtemelen bu, çünkü bu, std::reference_wrapper'un neden ilk sırada yer almasının nedeni.

+0

@songyuanyao şimdi çalışıyor –

+0

@songyuanyao ile bu kodu kullanıyorum Cevabımı güncelledim. Bunun bir hata mı olduğunu bilmiyorum. – Jts

+0

Tamam , Çok teşekkürler –

İlgili konular