我想在地图中使用原子变量。我使用的是Visual Studio 2012(msvc-11)和gcc 4.7。我已经定义了一个类型:
typedef std::map<uint64_t, std::atomic<int64_t>> value_map_t;
在msvc-11中,行
value_map_t map;
map[1] = 0;
产生错误:
错误C2248:
std::atomic<__int64>::atomic
:无法访问类std::atomic<__int64>
中声明的私有成员
gcc 4.7(see here)
也是如此错误:使用已删除的函数
std::atomic<long int>::atomic(const std::atomic<long int>&)
但是,在Visual Studio 2013(msvc-12)及更高版本以及gcc 4.8及更高版本中,它可以正常工作。
自己查看gcc 4.8和Visual Studio 2013+
我可以在msvc-11 / gcc 4.7中做些什么来使它工作?
答案 0 :(得分:2)
我无法访问Visual C ++编译器,但我猜测以下内容可能有效。使用间接,利用atomic
s:
#include <atomic>
#include <map>
#include <memory>
using atomic_ptr_t = std::shared_ptr<std::atomic<int64_t>>;
typedef std::map<uint64_t, atomic_ptr_t> value_map_t;
int main()
{
value_map_t map;
map[1] = atomic_ptr_t(new std::atomic<int64_t>(0));
return 0;
}
答案 1 :(得分:1)
来自@Yam Marcovic的提示我在Visual Studio 2012中找到了如何做到这一点:
#include <atomic>
#include <map>
#include <tuple>
typedef std::atomic<int64_t> value_t;
typedef std::map<uint64_t, value_t> atomic_map_t;
int main()
{
int64_t in = 5;
atomic_map_t map;
map.emplace(std::piecewise_construct,
std::forward_as_tuple(1), std::forward_as_tuple(in));
auto it = map.find(1);
int64_t out = it->second.load();
return 0;
}