| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > вектор из auto_ptr <T> |
| Автор: Станислав 20.5.2002, 13:55 |
| кто-нибудь пробовал создать такую очень полезную вещь, как контейнер, содержащий автоматические узазатели на объекты? если да, то опишите, плз., как вы это делали? у меня проблема. вот мой фрагмент: //----------------------------------------------------------------------------- class TTreeLevelNode { public: typedef std::auto_ptr < TTreeLevelNode > TChildAP; typedef std::vector < TChildAP > TTreeLevelChildren; // ... TTreeLevelNode * AddChild (TTreeLevelInfo & AData); void DeleteChildren (void); // ... protected: // ... TTreeLevelChildren Children; }; // ... TTreeLevelNode * TTreeLevelNode::AddChild (TTreeLevelInfo & AData) { TChildAP p (new TTreeLevelNode (AData, TreeView, this)); Children.push_back (p); // ОШИБКА ЗДЕСЬ!!! return p.get(); } //----------------------------------------------------------------------------- а ошибки следующие: [C++ Error] vector.cc(118): E2285 Could not find a match for 'auto_ptr<TTreeLevelNode>::operator =(const auto_ptr<TTreeLevelNode>)' [C++ Warning] memory.stl(193): W8037 Non-const function std::auto_ptr<TTreeLevelNode>::operator std::auto_ptr<TTreeLevelNode>::auto_ptr_ref<TTreeLevelNode>() called for const object [C++ Error] memory.stl(860): E2015 Ambiguity between 'auto_ptr<TTreeLevelNode>::operator auto_ptr<TTreeLevelNode>::auto_ptr_ref<TTreeLevelNode>()' and 'auto_ptr<TTreeLevelNode>::auto_ptr_ref<TTreeLevelNode>::auto_ptr_ref(auto_ptr<TTreeLevelNode> &)' djgpp дает аналогичные сообщения (что-то по поводу потери квалификатора при преобразовании из 'const auto_ptr <...>' в 'auto_ptr <...> &' |
| Автор: varnie 11.7.2008, 12:59 |
| читай http://www.gotw.ca/publications/using_auto_ptr_effectively.htm подобное сделать нельзя (и хороший компилятор должен адекватно об этом известить). почему нельзя -- читай статью. тема много где обсуждалась. вместо этого используй std::vector< boost::shared_ptr<T> > или подобное, но не с std::auto_ptr |
| Автор: vinter 11.7.2008, 13:04 |
| varnie, не хорошо сообщения накручивать, занимаясь некропостингом.. |
| Автор: varnie 11.7.2008, 14:58 |
| vinter верите нет, мне по-барабану на все эти статусы и прочие финтифлюшки=) я бы их вообще все отменил, была бы моя воля... то что я ответил на старый пост я уже сам понял, но уже после того как отпостил ответ. если бы вы обратили внимание, то увидели бы что я новичок на этом форуме (неск. дней всего здесь, ввиду хорошего коммунити по с++), а потому нек. оплошности, думаю, мне простительны на первых порах. а ответил я потому, что нашел тему без ответа, и решил, что будет полезно ответить. вотс. ps: с замечанием в принципе согласен, впредь буду обращать внимание на "устаревшесть" топиков. |
| Автор: mrbrooks 11.7.2008, 15:01 |
| все нормально имхо |
| Автор: Lazin 11.7.2008, 19:21 |
можно, поскольку у std::auto_ptr есть конструктор копирования и оператор присваивания, другое дело, что результат будет не тем, который ожидается |
| Автор: Ulysses4j 11.7.2008, 21:51 | ||
ANSI ISO/IEC 14882:1998, 20.4.5 par. 3. А мужики-то не знают... © |
| Автор: Lazin 11.7.2008, 22:06 | ||
можно Добавлено через 1 минуту и 57 секунд попробуй написать что то вроде этого:
код скомпилируется но работать не будет, вернее работать он будет, но не так как нужно а так как не нужно |
| Автор: vinter 11.7.2008, 22:52 | ||
попробуй, студия это не компилит. компилит :( никогда не читал стандарт, подобное написано то ли у Майерса, то ли у Джосьюттиса, то ли у Страуструпа, мне их слова достаточно,чтобы не рыскать по стандарту. очень странно, я знаю точно что у меня такое не компилилось, сейчас проверил в 2008 студии - схавало |
| Автор: Ulysses4j 11.7.2008, 23:03 |
| Поскольку то, что ты сказал, абсолютно неверно, то и читая Мейерса-Джасттиса-Страуструпа, ты просто не смог верно понять их слов. А со ссылками на то, чего не читал, я был бы поаккуратней. |
| Автор: vinter 11.7.2008, 23:11 | ||
лечить меня не надо да ну? апрям таки абсолютно? если написано , это всего лишь значит, что не смогли придумать как по человечески поставить заглушку, на использование этого класса в контейнерах. Так что это как минимум синоним запрета. А в книгах я видимо видел, что собираются внести в стандарт, или нечто подобное, что отложилось в памяти как запрещено стандартом |
| Автор: bsa 11.7.2008, 23:28 |
| В книжках говорится о том, что std::auto_ptr можно и нужно использовать, но для хранения в стандартных контейнерах он не предназначен. Поэтому не надо пытаться делать из них вектор или что-нибудь еще, так как результат может быть любым. |
| Автор: Ulysses4j 12.7.2008, 00:05 |
| bsa, мы, видимо, разные книжки читаем. Те книжки, которые читал я, говорили, что это довольно дурацкий класс и пирменять его имеет смысл, когда нужны строгие гарантии относительно исключений, а по возможности лучше пользоваться умными указателями с более прозрачным поведением. |
| Автор: JackYF 12.7.2008, 02:06 |
| Ссылкой не подтвержу, но, ЕМНИП, использовать std::auto_ptr в контейнерах STL либо не рекомендуется, либо запрещено. Из-за copy-destructive семантики. |
| Автор: lv151 24.6.2009, 10:12 | ||||
Спасибо за ответ.
+1. Сэкономил время. |