C++ unorderd_map插入因具有原子成员的value_type而失败<bool>


class strategy
{
int id;
std::atomic<bool> strategyStarted;
int startTime;
int endTime;
void getStartTime() { return startTime; }
void setStartTime(int sTime) { startTime = sTime; }
};
class strategyImpl{
std::unordered_map<int, strategy> allStrategies;
strategyImpl()
{
strategy newParams;
newParams.id = 1;
newParams.strategyStarted.store(false);
newParams.startTime = 104500;
newParams.endTime = 150500;
allStrategies.insert(std::make_pair(newParams.id, newParams)); <--ERROR
}
};

当我尝试向无序映射allStrategies插入/insert_or_assigne/template时,问题就出现了。以下是所有尝试过的方法及其特定的编译器错误。

allStrategies.insert(std::make_pair(newParams.id, newParams));

错误:对'std::unordered_map<int,策略>:插入(std::对<int,策略>('

allStrategies.insert(std::pair<int, strategy>(newParams.id, newParams));

错误:没有匹配的函数用于调用'std::pair<int,策略>:配对(int&,strategy&('

allStrategies.insert(std::unordered_map<int, strategy>::value_type(newParams.id, newParams));

错误:没有匹配的函数用于调用'std::pair<const int,策略>::配对(int&,strategy&('

allStrategies.insert_or_assign(newParams.id, newParams);

错误:使用已删除函数的策略&strategy::operator=(const strategy&('

allStrategies.emplace(newParams.id, newParams);

错误:没有匹配的函数用于调用'std::pair<const int,策略>::配对(int&,strategy&('

我已经尝试了所有可能的方法,但就是无法插入到这个无序的映射中。就我所读到的向映射添加条目的这些方法而言,值类型不需要具有默认构造函数或复制构造函数。

请帮我在此映射中插入键值对。怎么做?

编辑:

将导致问题的成员添加到类定义中(为了简洁起见,省略了它(根本原因似乎是成员atomic<bool> strategyStarted

删除成员后,insert(make_pair..(编译良好。

我真的必须在没有原子类型的情况下完成吗?

因此,基本问题是编译器由于std::atomic而无法生成默认的复制构造函数。所以你必须为自己写一个。例如

class strategy
{
public:
strategy() = default;
strategy(const strategy& rhs) 
: id(rhs.id)
, strategyStarted(rhs.strategyStarted.load())
, startTime(rhs.startTime)
, endTime(rhs.endTime)
{
}
strategy& operator=(const strategy& rhs); // to do
int id;
std::atomic<bool> strategyStarted;
int startTime;
int endTime;
int getStartTime() { return startTime; }
void setStartTime(int sTime) { startTime = sTime; }
};

有了这个补充,你之前的所有(或大部分(尝试都应该有效。

另一方面,您可以编写一个move构造函数,在这种情况下,try_emplace和类似的方法将起作用。

无论您选择哪一个,都应该添加相应的赋值运算符。

最新更新