7

I am trying to hash a string to a pointer to a void function which takes in a string. I get the following error when trying to insert my key value pair into the map:

"No matching member function for call to "insert"

I am not sure how to interpret this error.

I think I'm either passing in the wrong type for insert, the function reference incorrectly, or typedef'ing a function pointer wrong.

#include <string> #include <unordered_map> using namespace std; void some_function(string arg) { //some code } int main(int argc, const char * argv[]) { typedef void (*SwitchFunction)(string); unordered_map<string, SwitchFunction> switch_map; //trouble with this line switch_map.insert("example arg", &some_function); } 

Any advice would be appreciated.

1
  • Can you provide the complete error given? Commented Nov 9, 2015 at 16:48

3 Answers 3

10

If you look at the overloads for std::unordered_map::insert, you'll see these:

std::pair<iterator,bool> insert( const value_type& value ); template< class P > std::pair<iterator,bool> insert( P&& value ); std::pair<iterator,bool> insert( value_type&& value ); iterator insert( const_iterator hint, const value_type& value ); template< class P > iterator insert( const_iterator hint, P&& value ); iterator insert( const_iterator hint, value_type&& value ); template< class InputIt > void insert( InputIt first, InputIt last ); void insert( std::initializer_list<value_type> ilist ); 

There is no insert(key_type, mapped_type), which is what you're trying to do. What you meant was:

switch_map.insert(std::make_pair("example arg", &some_function)); 
Sign up to request clarification or add additional context in comments.

Comments

8

If you want to place a new entry in the map, without actually making a new entry yourself (aka std::pair), then use one of these two forms:

switch_map.emplace("example.org", &some_function); // OR: switch_map["example.org"] = &some_function; 

The method insert is only for adding PAIRS to the map.
If you need to use insert, then you must make a pair, as @Barry illustrated in his answer.

2 Comments

Can you explain how inserting without using pair, is not making a new entry? Not clear how both methods behave with respect to the map. Thank you!
The new pair is created (obviously); the difference is that YOU don't have to make the new pair. The function emplace or [] does the work for you. You get to skip calling std::make_pair.
0

The following code is working fine.

#include<iostream> #include <string> #include <unordered_map> using namespace std; void some_function(string arg) { return; //some code } int main(int argc, const char * argv[]) { typedef void (*SwitchFunction)(string); unordered_map<string, SwitchFunction> switch_map; //trouble with this line switch_map.insert(std::make_pair("example arg", &some_function)); } 

You have to use std::make_pair to insert the value.

1 Comment

Before submitting the solution.. already few people submitted the solution. Have to be fast :P

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.