no matching constructor for initialization of 'mapped_type' std::map error

為{幸葍}努か 提交于 2019-12-30 18:54:09

问题


I have this a class called 'Card' and I am trying to store some of its objects in a std::map Card.hpp:

class Card
{
public:
    enum ValueType { NOVALUE, ACE };
    enum FaceType { NOFACE, CLUBS };

    Card(const ValueType & _value, const FaceType & _face);
    Card(const Card & _card);
private:
    ValueType m_value;
    FaceType m_face;
};

Here is how I store and access it: Deck.hpp:

#include <map>

class Card;

class Deck
{
    public:
        Deck();

        std::size_t length() const;

        Card get_card(const int & _num);

    private:
        std::map<int, Card> m_deck;
};

Deck.cpp:

#include "Card.hpp"

Deck::Deck()
{
    m_deck.insert(std::pair<int, Card>(0, Card(Card::NOVALUE, Card::NOFACE)));
    m_deck.insert(std::pair<int, Card>(1, Card(Card::ACE, Card::CLUBS)));
}
std::size_t Deck::length() const
{
    return m_deck.size();
}

Card Deck::get_card(const int & _num)
{
    return m_deck[_num];
}

Now, when I compile it I get following error:

/usr/include/c++/4.6/bits/stl_map.h:453:45: error: no matching constructor for initialization of 'mapped_type' (aka 'Card')
          __i = insert(__i, value_type(__k, mapped_type()));
                                            ^
Deck.cpp:69:18: note: in instantiation of member function 'std::map<int, Card, std::less<int>, std::allocator<std::pair<const int, Card> > >::operator[]' requested here
    return m_deck[_num];
                 ^
./Card.hpp:30:2: note: candidate constructor not viable: requires 2 arguments, but 0 were provided
        Card(const ValueType & _value, const FaceType & _face);
        ^
./Card.hpp:32:2: note: candidate constructor not viable: requires 1 argument, but 0 were provided
        Card(const Card & _card);
        ^
1 error generated.

Why am I getting this error? I am using Card only as a value!


回答1:


The problem is that for a map, m_deck[_num] is designed to insert a default constructed Card if the element isn't already there. And Card doesn't have a default constructor.

You can use map::find to see if the entry is there, without creating one.




回答2:


For Deck::get_card() to compile, Card needs to provide a default constructor (presumably initializing the object to Card::NOVALUE, Card::NOFACE).

The reason for that is that m_deck[_num] returns a default-constructed instance of Card is _num is not in the map.



来源:https://stackoverflow.com/questions/13570126/no-matching-constructor-for-initialization-of-mapped-type-stdmap-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!