【问题标题】:Why my map of pointer to function isn't compiling? [duplicate]为什么我的函数指针映射没有编译? [复制]
【发布时间】:2016-11-01 21:49:26
【问题描述】:

我有这门课:

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&)>’
       };
   ^

知道为什么吗?

【问题讨论】:

  • 由于您使用enum struct,我认为您不能在不强制转换的情况下从枚举成员中初始化unsigned int 键。
  • 注意所有大写常量在 C++ 中都是反模式
  • std::map&lt;unsigned int,更改为std::map&lt;BabelPacket::Code,

标签: c++


【解决方案1】:

由于您的枚举是 class enum,因此它不会自动转换为 int。要么用它做一个常规枚举,我们使用 static_cast,要么使用 BabelPacket::Code 作为你的地图索引类型。

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多