I have a STL map in C++ where the key is an unsigned int, and the value is a class whose constructor is:
Foo::Foo(unsigned int integerValue){
//Some stuff
}
At other class I have declarated the std::map at the header:
private:
std::map<unsigned int, Foo> *m_mapFoo;
And at the cpp file I created it and inserted instances of Foo:
m_mapFoo = new std::map<unsigned int, Foo>;
m_mapFoo->insert(0, new Foo(0));
m_mapFoo->insert(1, new Foo(1));
But I'm getting the following error at the insert methods:
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*)’
Similar problem at find method:
m_mapFoo.find(0)->second->someFunctionIntoFooClass();
Where the error is exactly the following:
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> > >*’
Additional notes: I don't have a Foo copy constructor, but I don't think that's the problem.
Any help understanding this errors?
You have a pointer to a map containing Foo
values
std::map<unsigned int, Foo> *m_mapFoo;
and you are treating it as if it contained Foo
pointer values:
std::map<unsigned int, Foo*> *m_mapFoo;
Try this:
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)));
As for the second error, you have a pointer to a map, so you need
std::map<unsigned int, Foo>::iterator it = m_mapFoo->find(0);
if (it) {
it->second.someFunctionIntoFooClass();
} else {
// entry not found
}
Your map is typed to store objects of type Foo
, not pointers to objects of type Foo
. Seeing as you're trying to initialise the elements with new
and access their members via ->
, you probably want:
private:
std::map<unsigned int, Foo*> *m_mapFoo;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With