2016-11-01 2 views
0

У меня есть этот класс:Почему моя карта указателя на функцию не компилируется?

class TaskManager 
{ 
public: 
    TaskManager(); 
    ~TaskManager(); 

    using taskFunction = void (TaskManager::*)(BabelPacket const &); 
    void executeTask(Task const &task); 
    void signInTask(BabelPacket const &); 
    void signUpTask(BabelPacket const &); 
    void signOutTask(BabelPacket const &); 
    std::map<unsigned int, taskFunction> actions = 
    { 
    {BabelPacket::Code::SIGN_IN, &TaskManager::signInTask}, 
    {BabelPacket::Code::SIGN_UP, &TaskManager::signUpTask}, 
    {BabelPacket::Code::SIGN_OUT, &TaskManager::signOutTask}, 
    }; 
} 

И это мое перечисление

struct  BabelPacket 
{ 
    // Code enum 
    enum struct Code : unsigned int 
    { 
    NONE = 00, 
    // Requests 
    SIGN_IN = 100, 
    SIGN_UP = 101, 
    SIGN_OUT = 102, 
    } 
} 

Но когда я компилирую это я получил:

includes/TaskManager.hpp:38: error: could not convert ‘{{SIGN_IN, &TaskManager::signInTask}, {SIGN_UP, &TaskManager::signUpTask}, {SIGN_OUT, &TaskManager::signOutTask}}’ from ‘<brace-enclosed initializer list>’ to ‘std::map<unsigned int, void (TaskManager::*)(const BabelPacket&)>’ 
     }; 
^

Есть идея, почему?

+1

Поскольку вы используете 'enum struct', я не думаю, что вы можете инициализировать ключ' unsigned int' из членов перечисления, не отбрасывая их. –

+0

Обратите внимание, что все прописные константы являются антипасными в C++ – Slava

+0

change 'std :: map marcinj

ответ

1

Поскольку ваше перечисление является class enum, оно не является автоматически конвертируемым в int. Либо сделайте регулярное перечисление из него, наше использование static_cast, либо используйте BabelPacket::Code в качестве вашего типа индекса карты.