我有以下内容:
class Message
{
public:
bool process()
{
return doProcess();
}
protected:
virtual bool doProcess() = 0;
};
class Hello : public Message
{
protected:
bool doProcess()
{
return false;
}
};
typedef typename boost::mpl::map< boost::mpl::pair< boost::mpl::int_< 0 >, Hello > > map;
struct Generator
{
typedef void result_type;
template< typename t_type >
void operator()(std::vector< boost::shared_ptr< Message > >& processors,
t_type p_element)
{
typedef typename boost::mpl::at< map, t_type >::type c_instanceType
boost::shared_ptr< Message > temp(reinterpret_cast< Message* >(new c_instanceType));
p_processors[p_element] = temp;
}
};
然后调用它:
class MessageProcessor
{
public:
MessageProcessor() :
m_processors(12)
{
// eventually there will be 12 different messages so I will add
// them to the mpl map and adjust the range
boost::mpl::for_each< boost::mpl::range_c< boost::uint8_t, 0, 1 > >
(
boost::bind(Generator(), boost::ref(m_processors), _1)
}
private:
std::vector< boost::shared_ptr< Message > > m_processors;
};
此代码编译干净;但是,稍后调用该函数时会这样:
m_processors[0]->process();
在返回do进程的进程函数的行上发生了分段错误。我在gcc 4.8中使用boost版本1.55。另请注意,这不是整个代码。使用调试器时,我发现在调用doProcess时vptr似乎为null,因此子类似乎不存在。关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
因此问题似乎是在&lt;&gt;进行时实际上找不到该类型而且正在返回其他东西而不是Hello类型。看起来boost::for_each
传入的类型类型为boost::mpl::integral_c<boost::uint8_t, 0>
,因为我将boost::mpl::int_<0>
存储为密钥,所以它不存在于mpl映射中。将地图中的密钥类型更改为boost::mpl::integeral_c< boost::uint8_t, 0 >
不会出现段错误并按预期执行。