无法将元素添加到std :: map

时间:2012-05-20 22:33:13

标签: c++ stdmap

Foo.h:

class Foo
{
public:
    Foo(void);
    ~Foo(void);   

    void AddScreen(std::string name, ScreenBase &screenToAdd);

private:

    std::map<std::string, ScreenBase> m_screens;
};

Foo.cpp:

void Foo::AddScreen(string name, ScreenBase &screenToAdd)
{
    m_screens[name] = screenToAdd; 
}

最后一行创建了一个编译错误C2784:'bool std :: operator&lt;(const std :: _ Tree&lt; _Traits&gt;&amp;,const std :: _ Tree&lt; _Traits&gt;&amp;)':无法推断出模板参数对于'const std ::

注释掉最后一行,编译成功。

我是c ++的新手(来自托管语言)并且不知道为什么我不能用这个填充地图。

任何见解都表示赞赏。感谢。

ScreenBase.h :

    #pragma once
    class ScreenBase
    {
    public:
        ScreenBase();
        ~ScreenBase();

        virtual void Update(float tt, float dt);
        virtual void Render();
    };

ScreenBase.cpp:

#include "pch.h"
#include "ScreenBase.h"

ScreenBase::ScreenBase(void)
{
}
ScreenBase::~ScreenBase(void)
{
}
void ScreenBase::Update(float tt, float dt)
{

}
void ScreenBase::Render()
{

}

2 个答案:

答案 0 :(得分:2)

您忘记将以下行添加到Foo.cpp

#include <string>

那应该解决它。

修复它的原因是因为“&lt;”在那里定义了2个std::string个对象之间的运算符。由于std::map是一个关联数组,它会使用您指定的特定排序函数(作为模板的第三个参数,例如std::map<int, MyObj, MyIntCompareFunctor>)对键进行排序,或者它将默认使用&lt;密钥类型的运算符,在您的情况下为std::string

P.S。另外,通过引用传递字符串,而不是值: 例如void foo(const std::string& bar){};

答案 1 :(得分:1)

要在STL容器中使用某些类(如ScreenBase),该类必须符合某些规范(特征)。在这种情况下,ScreenBase必须是可复制构造的,因此至少需要

ScreenBase(const ScreenBase& src) { CopyFromOther(src); }

void CopyFromOther(const ScreenBase& src) {... do the stuff ... }

复制构造函数。

还必须定义&#34; =&#34; ScreenBase的运算符。如果你已经有了复制构造函数,它就是

ScreenBase& operator = (const ScreenBase& src) { CopyFromOther(src); return *this; }

为避免询问有关STL容器的所有问题,您还可以阅读SGI关于STL的文档。它描述了使用map / hashtables等内容所需的一切。

http://www.sgi.com/tech/stl/


您对派生类&#34;实例的评论&#34;提供另一种见解。然后尝试将指针存储到ScreenBase。

所以使用这个:

std::map<std::string, ScreenBase*> m_screens;

没有警告,但当然需要额外的内存管理。