如果我有一个称为基地以及类Derived1和Derived2的从基地继承多态基类。然后我可以使用boost :: lambda创建一个排序工厂。喜欢的东西:升压拉姆达与shared_ptr的
typedef boost::function<Base *()> Creator;
std::map<std::string,Creator> map1;
map1["Derived1"] = boost::lambda::new_ptr<Derived1>();
map1["Derived2"] = boost::lambda::new_ptr<Derived2>();
(这不是真正的代码,我只是想说明这个问题。)
这工作,所以后来我可以使用字符串做在地图上查找和然后调用lambda函数来实例化该类。都好。
这里的问题是,它是在原始指针打交道,我更愿意使用智能指针(的std :: shared_ptr的)。
所以,如果我改变来自:
typedef boost::function<Base *>() Creator;
到:
typedef boost::function<std::shared_ptr<Base> >() Creator;
那么我就要从这里卡住。我使用boost ::拉姆达::绑定与升压::拉姆达结合:: new_ptr试过,但我运气不好,不能让过去编译错误。 (巨大的模板相关的错误输出)。
我查看了StackOverflow中的其他类似消息,Using boost::bind and boost::lambda::new_ptr to return a shared_ptr constructor已关闭,但如果尝试应用其解决方案,则会出现上述模板错误。
我很高兴能提供的示例代码和实际的错误,如果有帮助,但希望上面的信息就足够了。我使用升压1.47.0 GCC上4.6以及4.7快照在Fedora 15
这是一个关于强制智能指针实施到用户的选择有趣的一点,我没有考虑到这一点。 –