С++ функция ptr в unorderer_map, ошибка времени компиляции

я пытаюсь реализовать unorderer_map, который реализуется как mapped_type, я смотрел несколько примеров, которые это реализуют, но я не могу заставить его работать. вот код:

#include<string>
#include <unordered_map>
namespace Test
{
  class Example
  {
  public:
    Example()
    {
      auto aPair=std::make_pair("one",&Example::procesString);
      map.insert(aPair);
    }
    void procesString(std::string & aString)
    {

    }
    void processStringTwo(std::string & aString)
    {

    }
    typedef void(*fnPtr)(std::string &);
    std::unordered_map<std::string,fnPtr> map;
  };
}

int main()
{
  return 0;
}

Я получаю эту ошибку времени компиляции:

ошибка: нет соответствующей функции для вызова 'std::unordered_map, void (*)(std::basic_string&)>::insert(std::pair, void (Test::Example::*)(std::basic_string&) >&)'

Спасибо!


person Ricardo_arg    schedule 29.05.2015    source источник
comment
Указатель на функцию-член — это не то же самое, что указатель на свободную функцию.   -  person Captain Obvlious    schedule 29.05.2015
comment
fnPtr должен быть указателем на функцию-член, а не просто указателем на функцию   -  person NathanOliver    schedule 29.05.2015
comment
я пытаюсь реализовать unorderer_map, который реализуется как mapped_type, я смотрел несколько примеров, которые реализуют это, но я не могу заставить его работать Понятия не имею, что это значит...   -  person Lightness Races in Orbit    schedule 29.05.2015


Ответы (1)


Указатель функции и указатель функции-члена — это две разные вещи. Вам либо нужно добавить бесплатную функцию на карту, либо вам нужно изменить карту, чтобы вместо этого использовать указатель функции-члена. Если вы хотите взять указатель функции-члена, вы можете использовать это:

typedef void(Example::*fnPtr)(std::string &);
person NathanOliver    schedule 29.05.2015
comment
Фу! std::function и std::bind, пожалуйста... Мы уже не в 1825 году - person Lightness Races in Orbit; 29.05.2015
comment
@LightnessRacesinOrbit это правда, что это было бы более элегантно. Тем не менее, все зависит от того, насколько критична функция ко времени. На моем компиляторе в оптимизированном режиме вызов указателя на функцию-член стоит 3 наносекунды, тогда как вызов функтора с привязкой к объекту стоит 36 наносекунд... - person Christophe; 29.05.2015
comment
@Christophe Пожалуйста, представьте свои тесты! Мне было бы интересно их проанализировать. - person Lightness Races in Orbit; 29.05.2015