1

フー.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 <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for '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()
{

}
4

2 に答える 2

2

次の行を Foo.cpp に追加するのを忘れました

#include <string>

それはそれを修正する必要があります。

それを修正する理由は、2 つstd::stringのオブジェクト間の「<」演算子がそこで定義されているためです。は連想配列であるためstd::map、指定した特定の並べ替え関数 (テンプレートの 3 番目のパラメーターとして、たとえばstd::map<int, MyObj, MyIntCompareFunctor>) を使用してキーを並べ替えるか、キー タイプの < 演算子を使用するようにデフォルト設定されますstd::string

PS また、値ではなく参照で文字列を渡します。void foo(const std::string& bar){};

于 2012-05-20T22:58:35.730 に答える
1

STL コンテナで何らかのクラス (ScreenBase など) を使用するには、そのクラスがいくつかの仕様 (特性) に準拠している必要があります。この場合、ScreenBase はコピー構築可能でなければならないため、少なくとも

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

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

コンストラクターをコピーします。

また、ScreenBase の「=」演算子を定義する必要があります。すでにコピーコンストラクターがあり、それが単に

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

STL コンテナについてあらゆる質問をするのを避けるために、STL に関する SGI のドキュメントを読むこともできます。マップ/ハッシュテーブルなどを使用するために必要なすべてが説明されています。

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


「派生クラスのインスタンス」に関するあなたのコメントは、別の洞察を与えてくれます。次に、ポインターを ScreenBase に格納してみてください。

だからこれを使う:

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

警告はありませんが、もちろん、追加のメモリ管理が必要になります。

于 2012-05-20T22:45:16.183 に答える