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::thread
konstruktor 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 № 1Nie 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));