【发布时间】:2017-08-24 11:40:02
【问题描述】:
我正在尝试构建一个具有许多依赖项的大型项目。阻止它构建的最后一件事(?)是 TBB 未能处理将int 转换为const tbb::<unsigned int>&。烦人的是使用std::atomic(特别是const std::atomic<unsigned int>&)的相同演员可以正常工作。我无法重构代码以使用std 而不是tbb(它使用了tbb 的其他不属于std 的功能)。
我创建了以下简单的测试用例:
#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。所以推测,如果有合适的演员,演员就会成功。我怎样才能添加一个?是否对tbb/atomic.h 进行了编辑以启用此演员表?
【问题讨论】:
-
如果将文字更改为
1u会发生什么? -
传递
1u会产生同样的错误 -
bad(tbb::make_atomic(1u));修复了此测试中的错误。但我不能用它来修复大型项目。我仍然需要一种不使用make_atomic()的方法来使这个演员工作。 -
documentation 指定由于 C++11 可以使用 constexpr c'tor,因此上述两个代码示例应该是等效的。我假设您使用的是 TBB,因为您不能使用 C++11?
-
看
tbb_config.h我可以看到__TBB_ATOMIC_CTORS是0。这取决于__TBB_CONSTEXPR_PRESENT。最近的 VS2017 更新 15.3 添加了constexpr支持。我正在使用 TBB 的 NuGet 发行版。相反,我需要自己构建 TBB,以便启用__TBB_ATOMIC_CTORS。这听起来像是问题解决了。
标签: c++ multithreading c++11 tbb