Вставкав карту - PullRequest
       41

Вставкав карту

2 голосов
/ 26 июня 2010

У меня проблемы с вставкой пары value_pairs в карту.Вот основная идея.

// private
typedef Foo* (*Bar)( const std::string &x, int y );
typedef std::map<std::string, Bar> myMap;

template<class T>
Foo* DoThing( const std::string &x, int y ) {
  return new T( x, y );
}

myMap m_map;

// some map insertion code
m_map.insert( myMap::value_type( "blah", &DoThing<SomeType> ));
m_map.insert( myMap::value_type( "blech", &DoThing<OtherType> ));

Это может привести к ошибке компилятора, говорящей no matching function call to std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Foo* (*)(const std::string&, int)>::pair(const char [5], <unresolved overloaded function type>) Не уверен, что я неправильно делаю синтаксис или почему получаю unresolved overloaded function type.Я думаю, что он не знает, что DoThing возвращает Foo*.

Любая помощь приветствуется, спасибо.

Ответы [ 3 ]

5 голосов
/ 26 июня 2010

Комментарий преобразован в ответ:

Просто чтобы быть уверенным, DoThing<T> является глобальной функцией, а не членом какого-либо класса, верно? Если он внутри класса, он должен быть статической функцией-членом.

Кроме того, если вы берете адрес функции-члена, некоторые компиляторы настаивают на присвоении ему имени класса, например, &MyClass::DoThing<T>. Опять же, если это статическая функция-член, вы получите обычный указатель на функцию. Если функция не является статической, вы получаете указатель на член, и указатель this должен быть предоставлен на сайте вызова.

1 голос
/ 26 июня 2010

Я предполагаю, что он не знает, как преобразовать "blah" и "blech" в std :: stringsЕсли вы построите их явно, я думаю, что это должно сработать.

1 голос
/ 26 июня 2010

Вы забыли "," перед вторым &.

...