2014-07-26 9 views
5

में पास करने का प्रयास कर रहा है मेरे पास एक ऐसा फ़ंक्शन है जो स्ट्रिंग का वेक्टर लेता है, और मेरे पास वेक्टर में स्ट्रिंग वेक्टर की एक श्रृंखला है।एक वेक्टर की सामग्री को थ्रेड

मैं तार के प्रत्येक वेक्टर को एक नए धागे में गुजरने वाले वेक्टर के माध्यम से लूप करना चाहता था।

for (vector<vector<string> >::iterator it = vecstringvec.begin() ; 
    it != vecstringvec.end(); ++it){ 
    threadvector.push_back(thread(func, *it)); 
} 

उपर्युक्त उपर्युक्त उपरोक्त को छोड़कर काम नहीं करता है (त्रुटि संकलित करें)। मुझे विश्वास है कि मुझे पास करने के लिए वेक्टर के std :: ref की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि, या इटरेटर का उपयोग करके ऐसा कैसे करें।

पूर्ण त्रुटि:

/usr/include/c++/4.8/functional: In instantiation of ‘struct std::_Bind_simple<void (*(std::vector<std::basic_string<char> >, std::reference_wrapper<std::vector<std::basic_string<char> > >))(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >&)>’: 
/usr/include/c++/4.8/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >&); _Args = {std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::reference_wrapper<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >}]’ 
prog.cpp:199:55: required from here 
/usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<void (*(std::vector<std::basic_string<char> >, std::reference_wrapper<std::vector<std::basic_string<char> > >))(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >&)>’ 
     typedef typename result_of<_Callable(_Args...)>::type result_type; 
                  ^
/usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<void (*(std::vector<std::basic_string<char> >, std::reference_wrapper<std::vector<std::basic_string<char> > >))(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >&)>’ 
     _M_invoke(_Index_tuple<_Indices...>) 
     ^
make: *** [prog.o] Error 1 
+0

आपको क्या लगता है कि यह काम नहीं करता है? – Johan

+0

जब आप बैठे "काम नहीं करता", तो इसका मतलब क्या है? क्या आप विस्तार से बता सकते हैं? –

+0

एक त्रुटि जो टिप्पणी बॉक्स के लिए स्पष्ट रूप से बहुत लंबी है। इस तरह की कई चीजें हालांकि: ^ /usr/include/c++/4.8/functional:1727:9: त्रुटि: 'वर्ग' में 'प्रकार' नाम का कोई प्रकार नहीं है :: result_of )) (std :: basic_string , std :: वेक्टर >> और)> ' _M_invoke (_Index_tuple <_Indices...>) – user3816764

उत्तर

7

त्रुटि संदेश को देखते हुए, func() वेक्टर पैरामीटर एक पास-दर-संदर्भ और नहीं एक पास-दर-मूल्य है। std::ref(*it) का उपयोग करने का प्रयास करें।

cppreference का हवाला देते हुए:

The arguments to the thread function are copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref).

उदाहरण:

#include <vector> 
#include <thread> 
#include <iostream> 

void func(const std::vector<int>& value) 
{ 
    std::cout << "Value: " << value.size() << std::endl; 
} 

int main(int argc, char const *argv[]) 
{ 
    std::vector<std::vector<int>> values = 
     { { 1, 2 } , { 1, 2, 3 }, { 1, 2, 3, 4 } }; 

    std::vector<std::thread> threads; 
    for (auto& vect: values) 
    { 
     threads.emplace_back(func, std::cref(vect)); 
    } 

    for (auto& thread: threads) 
    { 
     thread.join(); 
    } 

    return 0; 
} 

(BTW नैदानिक ​​एक पूर्ण आत्म के साथ बहुत आसान हो गया होता उदाहरण निहित)।

+0

मैंने std :: ref (* it) का उपयोग करने का कोई फायदा नहीं लिया है। – user3816764

+0

ऐसा लगता है कि ओपी चाहता है कि एक गैर-कॉन्स्ट संदर्भ 'func' को पास किया जाए - जो मुझे लगता है कि बस आपके कोड के साथ काम करेगा। –

+1

@ user3816764 मेरा उदाहरण संकलित और काम करता है। क्या आप अपने कोड में कुछ diffs खोज सकते हैं? – Johan

संबंधित मुद्दे