Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'No matching function for call' error when inserting class into a STL map

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?

like image 889
Roman Rdgz Avatar asked Nov 20 '12 14:11

Roman Rdgz


2 Answers

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
}
like image 144
juanchopanza Avatar answered Nov 16 '22 08:11

juanchopanza


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;
like image 36
Angew is no longer proud of SO Avatar answered Nov 16 '22 08:11

Angew is no longer proud of SO