Roman Rdgz
Roman Rdgz

Reputation: 13254

'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?

Upvotes: 10

Views: 26309

Answers (3)

Robᵩ
Robᵩ

Reputation: 168626

From the little information you give, it seems unlikely that you need to use pointers anywhere: Try this:

In the header:

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

And at the cpp file:

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

The semantics of operator[] are slightly different than .insert(). If you need .insert(), use it. But unless you are relying upon the subtle difference, use the more readable operator[].

Similarly at the find method, the expression becomes much more readable if you avoid pointers and use operator[]:

m_mapFoo[0].someFunctionIntoFooClass();

Upvotes: 0

juanchopanza
juanchopanza

Reputation: 227418

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
}

Upvotes: 7

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;

Upvotes: 3

Related Questions