There is no corresponding constructor to initialize 'mapped_type' std :: map error

I have a class called "Map" and I'm trying to save some of its objects in 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; }; 

This 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 the 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 use the Card only as a value!

+4
source share
2 answers

The problem is that to display m_deck[_num] intended to insert the default Card , if the element does not already exist. And Card does not have a default constructor.

You can use map::find to see if there is a record without creating it.

+7
source

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

The reason for this is that m_deck[_num] returns the default instance of Card is _num that is not on the map.

0
source

All Articles