Если у меня есть полиморфный базовый класс с именем Base, а также классы Derived1 и Derived2, которые наследуются от Base.Затем я могу использовать boost :: lambda для создания своего рода фабрики.Что-то вроде:
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>();
(Это не настоящий код, я просто пытаюсь проиллюстрировать проблему.)
Это работает, поэтому я могу выполнить поиск на картеиспользуя строку, а затем вызвать лямбда-функцию для создания экземпляра этого класса.Все хорошо.
Проблема в том, что он работает с необработанными указателями, я бы предпочел использовать умные указатели (std :: shared_ptr).
Так что если я изменю с:
typedef boost::function<Base *>() Creator;
до:
typedef boost::function<std::shared_ptr<Base> >() Creator;
Тогда я застреваю отсюда.Я пытался использовать boost :: lambda :: bind в сочетании с boost :: lambda :: new_ptr, но мне не очень повезло, я не могу получить ошибки компиляции.(Огромное количество выходов ошибок, связанных с шаблоном.)
Я проверил другие подобные сообщения в StackOverflow, Используя boost :: bind и boost :: lambda :: new_ptr, чтобы вернуть конструктор shared_ptr близко, но если я пытаюсь применить его решение, я получаю ошибки шаблона, упомянутые выше.
Я рад предоставить пример кода и фактические ошибки, если это поможет, но, надеюсь, приведенной выше информации достаточно.Я использую boost 1.47.0 на GCC 4.6, а также снимок 4.7 на Fedora 15.