我正在尝试构建一个具有许多依赖项的大型项目。阻止它构建的最后一件事(?)是TBB无法处理int
到const 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
的修改可以启用此演员?
答案 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
显式构造它。