2014-07-26 8 views
5

Ich habe eine Funktion, die einen Vektor von Zeichenfolgen verwendet, und ich habe eine Reihe dieser Zeichenfolge Vektoren in einem Vektor.Ich versuche, Inhalt eines Vektors zu einem Thread zu übergeben

Ich wollte den Vektor durchlaufen jeden Strings Vektor zu einem neuen Thread übergeben.

Im Wesentlichen die oben genannten, außer den obigen funktioniert nicht (Fehler kompilieren). Was ich glaube ist, dass ich ein std :: ref des Vektors benötige, um weiterzugeben, aber ich bin mir nicht sicher, genau, oder wie man das mit dem Iterator macht.

voller Fehler:

/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

Was denkst du, dass es nicht funktioniert? – Johan

+0

Wenn du es gesessen hast, "funktioniert nicht", was meinst du damit? Kannst du bitte etwas ausarbeiten? –

+0

Ein Fehler, der offensichtlich zu lang für das Kommentarfeld ist. Eine Menge Dinge wie diese aber: ^ /usr/include/c++/4.8/functional:1727:9: Fehler: keine Art mit dem Namen 'Typ' in 'Klasse Std :: Ergebnis_von )) (std :: basic_string , std :: vector >> &)>‘ _M_invoke (_Index_tuple <_Indices...>) – user3816764

Antwort

7

bei der Fehlermeldung Sehen, func() Vektorparameter sind eine Pass-by-reference und nicht ein Pass-by-Wert. Versuchen Sie es mit std::ref(*it).

Zitiert 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).

Beispiel:

#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 die Diagnose mit einem vollen eigenständig Beispiel viel einfacher gewesen wäre).

+0

Ich habe versucht, mit std :: ref (* it) ohne Erfolg. – user3816764

+0

Es sieht so aus, als ob das OP möchte, dass eine nicht-konstante Referenz an 'func' übergeben wird - was meiner Meinung nach nur mit Ihrem Code funktionieren wird. –

+1

@ user3816764 Mein Beispiel kompilieren und arbeiten. Kannst du Unterschiede in deinem Code erkennen? – Johan

Verwandte Themen