std :: multimap中的c ++枚举类

时间:2015-07-03 10:27:55

标签: c++ c++11

我有2个enum s属于较新的枚举类类型。

enum class Action
{
    Move,
    Attack,
    Die,
    Splash,
    Idle
};

enum class Facing
{
    Left,
    LeftUp,
    LeftDown,
    Up,
    Down,
    Right,
    RightUp,
    RightDown
};

我希望将这些内容存储在多图中:

std::multimap<Entity::Facing,std::pair<Entity::Action,std::unique_ptr<Animation>>> listAnimation;

关键是:面对,对是实体+动画的动作。

这是我插入它的方式:

std::unique_ptr<Animation> splashUp (new Animation());
splashUp->setSpriteSheet(*texture);
splashUp->addFrame(sf::IntRect(3584,256,128,128));
splashUp->addFrame(sf::IntRect(3712,256,128,128));
splashUp->addFrame(sf::IntRect(3840,256,128,128));
splashUp->addFrame(sf::IntRect(3968,256,128,128));
splashUp->addFrame(sf::IntRect(4096,256,128,128));
splashUp->addFrame(sf::IntRect(4224,256,128,128));
splashUp->addFrame(sf::IntRect(4352,256,128,128));
splashUp->addFrame(sf::IntRect(4480,256,128,128));

this->listAnimation.insert(Entity::Facing::Up, std::make_pair(Entity::Action::Splash, std::move(splashUp)));

这是一个错误,即使经过大量的谷歌搜索,我也无法解决这个问题:

  

错误C2664:&#39; std :: _ Tree_iterator&lt; _Mytree&gt;   的std ::多重映射&LT; _Kty,_Ty&GT; ::插入件(STD :: _ Tree_const_iterator&LT; _Mytree&GT;,const的   的std ::对&LT; _Ty1,_Ty2&GT; &安培;)&#39; :无法转换参数1   &#39;实体::面对&#39;到&#39; std :: _ Tree_const_iterator&lt; _Mytree&gt;&#39; 1 GT;
  用1> [1>   _Mytree =标准:: _ Tree_val&GT;&GT;&GT;&gt;中   1 GT; _Kty =实体::面对,1&gt;
  _Ty = std :: pair&gt;,1&gt; _Ty1 = const Entity :: Facing,1&gt; _Ty2 =标准::对&GT; 1 GT; ] 1&gt;和1> [1>   _Mytree =标准:: _ Tree_val&GT;&GT;&GT;&GT;   1 GT; ] 1&gt;没有用户定义的转换运算符   可以执行此转换,或运营商不能   称为

我可以将枚举类用作多重映射中的键吗?

2 个答案:

答案 0 :(得分:1)

multimap<Key, Value>::insert()只接受一个参数,该参数应该可以转换为std::pair<const Key, Value>

为方便起见,可能还有一些加速(因为您不必创建临时pair),您可以使用emplace()代替:

listAnimation.emplace(Entity::Facing::Up, std::make_pair(Entity::Action::Splash, std::move(splashUp)));

答案 1 :(得分:0)

如果您检查docs for multimap::insert,则可以看到没有任何方法的签名与您尝试执行的操作相匹配。方法是:

  

单个元素(1)iterator insert (const value_type& val);,提示符(2)iterator insert (iterator position, const value_type& val); range (3) 模板void insert(首先是InputIterator,最后是InputIterator);`

你试图在对象中插入一个值,即(1),但是编译器很困惑,因为函数arity使它看起来像后者2.

要插入值,您需要创建一对,即insert(make_pair(...))。作为一种特殊情况,每个数据也会在您的情况下映射到一对,因此最终会成为insert(make_pair(..., make_pair(...)))

在任何情况下,没有insert将密钥和映射作为两个参数,正如您尝试的那样。