2015-02-18 3 views
0

Я новичок на C++ и имею проблему относительно std:map с указателями функций.Использование указателей функций в std :: map

Я создал map, который имеет в качестве ключа string и хранит указатель функции как значение. Я столкнулся с осложнением, когда попытался использовать функцию insert(), чтобы добавить указатель на функцию. Однако он работал, когда я использовал [] оператора. Если можете, объясните это различие.

Вот пример кода, который я написал.

OperatorFactory.h

#ifndef OPERATORFACTORY_H 
#define OPERATORFACTORY_H 

#include <string> 
#include <map> 

using namespace std; 

class OperatorFactory 
{ 
    public: 
     static bool AddOperator(string sOperator, void* (*fSolvingFunction)(void*)); 
     static bool RemoveOperator(string sOperator); 
     static void RemoveAllOperators(); 

    private: 
     static map<string , void* (*) (void*)> map_OperatorMap; 
}; 

// Static member re-declaration 
map<string, void* (*) (void*)> OperatorFactory::map_OperatorMap; 

#endif // OPERATORFACTORY_H 

OperatorFactory.cpp

#include "OperatorFactory.h" 

void OperatorFactory::RemoveAllOperators() 
{ 
    map_OperatorMap.clear(); 
} 

bool OperatorFactory::RemoveOperator(string sOperator) 
{ 
    return map_OperatorMap.erase(sOperator) != 0; 
} 

bool OperatorFactory::AddOperator(string sOperator, void* (*fSolvingFunction)(void*)) 
{ 
    // This line works well. 
    map_OperatorMap[sOperator] = fSolvingFunction; 

    // But this line doesn't. 
    // map_OperatorMap.insert(sOperator, fSolvingFunction); // Error 
    return true; 

} 

Ошибка говорит:

error: no matching function for call to 'std::map<std::basic_string<char>, void* (*)(void*)>::insert(std::string&, void* (*&)(void*))' 

Даже если я получил эту работу (скомпилированный) с [], я хотел бы знать, почему у меня возникла ошибка при использовании insert().

спасибо.

ответ

4

Вы вставляете элементы в станде :: карту с помощью зОго :: пары ключа и значения:

map.insert(std::make_pair(key,value)); 

В качестве альтернативы вы можете устанавливать значения в C++ 11:

map.emplace(key,value); 

[] возвращает ссылку на значение переданного ключа:

value_type & 

И автоматически создает элемент для th на ключ, если он еще не существует. Убедитесь, что вы понимаете, какая разница в поведении между оператором insert() и [] перед их использованием (последний заменит существующие значения для ключа, например).

Для получения дополнительной информации см. http://en.cppreference.com/w/cpp/container/map.

+0

Great .. !!! Большое спасибо..! –

Смежные вопросы