为什么TBB不能将`int`转换为`const tbb :: atomic <unsigned int =“”>&amp;`,但是std :: atomic可以吗?

时间:2017-08-24 11:40:02

标签: c++ multithreading c++11 tbb

我正在尝试构建一个具有许多依赖项的大型项目。阻止它构建的最后一件事(?)是TBB无法处理intconst tbb::<unsigned int>&的转换。令人讨厌的是,使用std::atomic(特别是const std::atomic<unsigned int>&)的相同演员表工作正常。我无法重构代码以使用std代替tbb(它使用的tbb的其他功能不属于std。)< / p>

我创建了以下简单的测试用例:

#include <tbb/atomic.h>
#include <atomic>

void good(const std::atomic<unsigned int>& i) {
}

void bad(const tbb::atomic<unsigned int>& i) {
}

int main() {
    good(1);
    bad(1); // error C2664: 'void bad(const tbb::atomic<unsigned int> &)': cannot convert argument 1 from 'int' to 'const tbb::atomic<unsigned int> &'
}

有没有人知道如何解决这个问题(不使用TBB)?我需要它在VS2017中工作。

编辑: 另外,我收到以下错误: Error (active) E0415 no suitable constructor exists to convert from "int" to "tbb::atomic<unsigned int>" Testmain.cpp 15。因此,如果有一个合适的c,那么演员就会成功。我该如何添加一个?是否有tbb/atomic.h的修改可以启用此演员?

2 个答案:

答案 0 :(得分:2)

固定!问题在于预处理器定义了我正在使用的TBB的NuGet发行版已经过时了。 VS2017版本15.3.2支持constexpr,这是启用__TBB__ATOMIC_CTORS所必需的。感谢@StoryTeller指出我正确的方向。

修复:Git克隆TBB的最新src并构建。 (有趣的是,C ++中的快捷方式很少是快捷方式)。

答案 1 :(得分:1)

从源代码(我在https://github.com/01org/tbb/blob/tbb_2017/include/tbb/atomic.h找到,我自己没有TBB)我可以看到public List<?> findLimitedSorted(Query query, Object target, String startFrom) { query.limit(100); query.with(new Sort(Sort.Direction.ASC, "<field_name>")); return getMongoTemplate().find(query, target.getClass()); } 只定义了赋值运算符,所以没有非显式构造函数,这意味着您必须使用struct atomic显式构造它。