提升线程:术语不评估为0参数

时间:2017-05-15 11:34:27

标签: c++ boost

版本信息:我使用的是boost 1.64和Visual Studio 2015

我很难理解这个提升编译错误。

我的示例代码是:

#include <iostream>
#include <boost\thread.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;
}

编译失败,错误为:boost\thread\detail\thread.hpp(116): error C2064: term does not evaluate to a function taking 0 arguments

为什么要尝试将其编译为带0参数的函数?不应该传递给boost::thread构造函数的两个额外参数告诉提升参数testfunc需要多少?

编辑:

问题似乎不是boost::thread构造函数,而是包装指针的unique_ptr。没有它,代码编译。 至于为什么会这样,我仍然没有线索。

1 个答案:

答案 0 :(得分:3)

这与Boost,矢量,字符串或线程无关。

您在这里使用make_unique<T>错误:

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

构造T需要参数,但是你将原始指针传递给已经构造的对象。 boost::thread不知道如何处理boost::thread*

你应该简单地写一下:

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