【问题标题】:no matching constructor for initialization of 'mapped_type' std::map error'mapped_type' std::map 错误的初始化没有匹配的构造函数
【发布时间】:2012-11-26 17:35:24
【问题描述】:

我有一个名为“Card”的类,我试图将它的一些对象存储在 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;
};

这是我存储和访问它的方式: 甲板.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];
}

现在,当我编译它时,出现以下错误:

/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.

为什么会出现此错误?我仅将 Card 用作值!

【问题讨论】:

    标签: c++ stdmap


    【解决方案1】:

    问题在于,对于地图,m_deck[_num] 旨在插入一个默认构造的Card,如果该元素尚不存在。而Card 没有默认构造函数。

    您可以使用map::find 来查看条目是否存在,而无需创建条目。

    【讨论】:

    • 只有在存在_num 元素时才有效。否则 find 将返回m_deck.end(),它没有second
    • 是的,但这比尝试返回默认对象更接近预期结果。至少对我来说。
    【解决方案2】:

    Deck::get_card()要编译,Card需要提供一个默认构造函数(大概是初始化对象为Card::NOVALUECard::NOFACE)。

    原因是m_deck[_num] 返回一个默认构造的Card 实例,_num 不在映射中。

    【讨论】:

    • 另外一个问题是,他真的需要这里的地图吗?
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多