/ / Zwiększenie wątku: Termin nie ocenia funkcji przyjmując 0 argumentów - c ++, boost

Zwiększenie wątku: Termin nie ocenia funkcji przyjmującej 0 argumentów - c ++, boost

Informacje o wersji: Używam boost 1.64 i Visual Studio 2015

Mam trudności ze zrozumieniem tego błędu kompilacji boost.

Mój przykładowy kod to:

#include <iostream>
#include <boostthread.hpp>

using namespace std;

void testfunc(vector<int> &first, vector<string> &second)
{
first.push_back(42);
cout << "I live." << endl;
}

int main()
{
vector<int> first;
vector<string> second;
unique_ptr<boost::thread> thr = make_unique<boost::thread>(new boost::thread(testfunc, boost::ref(first), boost::ref(second)));

return 0;
}

Kompilacja kończy się niepowodzeniem z błędem: boostthreaddetailthread.hpp(116): error C2064: term does not evaluate to a function taking 0 arguments

Dlaczego próbuje skompilować go jako funkcję, która przyjmuje 0 parametrów? Gdyby dwa dodatkowe argumenty nie przeszły do boost::threadkonstruktor powiedzieć zwiększyć liczbę parametrów testfunc trwa?

Problem nie wydaje się być boost::thread konstruktor, ale unique_ptr który zawija wskaźnik. Bez niego kod się kompiluje. Jeśli chodzi o to, dlaczego tak się dzieje, wciąż nie mam pojęcia.

Odpowiedzi:

3 dla odpowiedzi № 1

Nie ma to nic wspólnego z Boostem, wektorami, łańcuchami ani wątkami.

Używasz make_unique<T> źle tutaj:

make_unique<boost::thread>(new boost::thread(testfunc, boost::ref(first), boost::ref(second)));
//                         ^^^^^^^^^^^^^^^^^^

Wymaga argumentów do skonstruowania T, ale przekazujesz mu surowy wskaźnik do już skonstruowanego obiektu. boost::thread nie wie, co zrobić z boost::thread*.

Zamiast tego powinieneś po prostu napisać:

make_unique<boost::thread>(testfunc, boost::ref(first), boost::ref(second));