C++ 表达式:映射/集合迭代器不兼容创建映射时断言

C++ 表达式:映射/集合迭代器不兼容创建映射时断言,c++,map,set,assert,C++,Map,Set,Assert,我有导致断言失败的代码。当我在映射中只保留一个项目(对)时,代码可以工作,但两个或更多个项目会触发错误。我在debugger下进行了跟踪,发现所有涉及类型的实例(我指的是pair,set)都已正确创建。但是,当流变成包含表定义的分号时,就会弹出这个断言失败 basic.hpp namespace ccnet { enum class master_command_code { RESET = 0x30, GET_STATUS

我有导致断言失败的代码。当我在映射中只保留一个项目(对)时,代码可以工作,但两个或更多个项目会触发错误。我在debugger下进行了跟踪,发现所有涉及类型的实例(我指的是pair,set)都已正确创建。但是,当流变成包含表定义的分号时,就会弹出这个断言失败

basic.hpp

namespace ccnet
{

enum class master_command_code 
{
  RESET                   = 0x30,
  GET_STATUS              = 0x31
};

enum class slave_message_type 
{
  GENERAL = 1, // response to a master command bearing data
  ACK     = 0,
  NACK    = 0xff,
  ILLEGAL = 0x30,
  UNKNOWN = 2 // if we are unable to identify the data
};

/** Slave message set. */
typedef std::set<slave_message_type> slave_messsage_set_type;

const slave_messsage_set_type& allowed_reply(master_command_code code);
} // namespace ccnet
名称空间ccnet
{
枚举类主命令代码
{
重置=0x30,
获取_状态=0x31
};
枚举类从属消息类型
{
GENERAL=1,//对承载数据的主命令的响应
ACK=0,
NACK=0xff,
非法=0x30,
未知=2//如果我们无法识别数据
};
/**从消息集*/
typedef std::set slave_message_set_type;
const slave消息设置类型和允许回复(主命令代码);
}//名称空间ccnet
basic.cpp

const ccnet::slave_messsage_set_type& ccnet::allowed_reply(master_command_code code)
{
  typedef map<master_command_code, slave_messsage_set_type> master_slave_table_map;

  static const master_slave_table_map table =
    {
      // applicable in all states
      { master_command_code::RESET,
        { slave_message_type::ACK, slave_message_type::NACK } },

      { master_command_code::GET_STATUS,
        { slave_message_type::GENERAL, slave_message_type::NACK } }
    }; // <-- assert here

  const auto it = table.find(code);
  if (it == table.end())
  {
    throw std::runtime_error(
      "Unregistered/unimplemented master command code specified");
  }

  return it->second;
}
const ccnet::slave\u message\u set\u type&ccnet::allowed\u reply(master\u命令\u代码)
{
typedef映射主从表映射;
静态常量主从表映射表=
{
//适用于所有州
{master_command_code::RESET,
{slave_message_type::ACK,slave_message_type::NACK},
{master_command_code::GET_STATUS,
{slave_message_type::GENERAL,slave_message_type::NACK}}
}第二;
}
我不知道为什么会这样,代码看起来不错。
我使用MSVC-12。这不是线程并发问题,我已经检查过了。1.它是静态的;2.我把它放在main()的第一行,就有了问题。(

如果您可以更新您的帖子,使其包含实际的枚举和适当的周围名称空间decls,这将非常有帮助。如图所示,这有点像意大利面条。如果您可以为我们创建一个新的名称空间,这可能会有所帮助。这应该不会太难,因为您基本上只省略了一些细节。如果示例编译并运行良好,那么问题p很可能在其他地方。我已经按照您的要求进行了更改。我抛出了未包含的异常类,只支持std::invalid_参数。应该与您的实际问题没有区别,我无法使用clang 3.4复制。抱歉,我手头没有VS12安装来测试该配置。对于gcc和)。是的,问题出现在罚球线之前。