9

キーが unsigned int で、値がコンストラクターが次のクラスである C++ の STL マップがあります。

Foo::Foo(unsigned int integerValue){
    //Some stuff
}

他のクラスでは、ヘッダーで std::map を宣言しました。

private:
    std::map<unsigned int, Foo> *m_mapFoo;

そして、cpp ファイルで、私はそれを作成し、Foo のインスタンスを挿入しました:

m_mapFoo = new std::map<unsigned int, Foo>;
m_mapFoo->insert(0, new Foo(0));
m_mapFoo->insert(1, new Foo(1));

しかし、挿入メソッドで次のエラーが発生します。

no matching function for call to ‘std::map<unsigned int, Foo, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, Foo> > >::insert(const unsigned int&, Foo*)’

find メソッドでの同様の問題:

m_mapFoo.find(0)->second->someFunctionIntoFooClass();

エラーは正確には次のとおりです。

request for member ‘find’ in ‘((Foo*)this)->Foo::m_mapGeoDataProcess’, which is of non-class type ‘std::map<unsigned int, Foo, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, Foo> > >*’

追加メモ: Foo コピー コンストラクターはありませんが、それが問題だとは思いません。

このエラーを理解するのに役立ちますか?

4

3 に答える 3

6

Foo値を含むマップへのポインターがあります

std::map<unsigned int, Foo> *m_mapFoo;

Fooそして、ポインター値が含まれているかのように扱っています。

std::map<unsigned int, Foo*> *m_mapFoo;

これを試して:

m_mapFoo = new std::map<unsigned int, Foo>;
m_mapFoo->insert(std::make_pair(0, Foo(0)));
m_mapFoo->insert(std::make_pair(1, Foo(1)));

2番目のエラーについては、マップへのポインターがあるため、必要です

std::map<unsigned int, Foo>::iterator it = m_mapFoo->find(0);
if (it) {
  it->second.someFunctionIntoFooClass();
} else {
  // entry not found
}
于 2012-11-20T14:57:20.560 に答える
3

マップは、 typeのオブジェクトへのポインターではなく、 type のオブジェクトを格納するように型指定されています。で要素を初期化し、を介してそのメンバーにアクセスしようとしているのを見ると、おそらく次のことが必要になります。FooFoonew->

private:
    std::map<unsigned int, Foo*> *m_mapFoo;
于 2012-11-20T14:57:06.237 に答える
0

あなたが与える小さな情報から、どこでもポインターを使用する必要があるとは思えません:これを試してください:

ヘッダー内:

private:
    std::map<unsigned int, Foo> m_mapFoo;

そして、cpp ファイルで:

m_mapFoo[0] = Foo(0);
m_mapFoo[1] = Foo(1);

のセマンティクスは とoperator[]は少し異なり.insert()ます。が必要な場合は.insert()、それを使用してください。ただし、微妙な違いに依存している場合を除き、より読みやすい を使用してくださいoperator[]

同様に find メソッドでも、ポインターを避けて以下を使用すると、式がより読みやすくなりますoperator[]

m_mapFoo[0].someFunctionIntoFooClass();
于 2012-11-20T15:24:53.453 に答える