Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
все нормально имхо  smile  smile впринципе это может кому нибудь и по надобится.

Автор: Lazin 11.7.2008, 19:21
Цитата(varnie @  11.7.2008,  12:59 Найти цитируемый пост)
подобное сделать нельзя

можно, поскольку у std::auto_ptr есть конструктор копирования и оператор присваивания, другое дело, что результат будет не тем, который ожидается smile 

Автор: vinter 11.7.2008, 20:57
Цитата(Lazin @  11.7.2008,  20:21 Найти цитируемый пост)
можно, поскольку у std::auto_ptr есть конструктор копирования и оператор присваивания, другое дело, что результат будет не тем, который ожидается

нельзя, это запрещено стандартом.

Автор: Ulysses4j 11.7.2008, 21:51
Цитата(vinter @  11.7.2008,  20:57 Найти цитируемый пост)
нельзя, это запрещено стандартом.

Цитата
auto_ptr does not meet the CopyConstructible and Assignable requirements for Standard Library container elements and thus instantiating a Standard Library container with an auto_ptr results in undefined behavior.

ANSI ISO/IEC 14882:1998, 20.4.5 par. 3.

А мужики-то не знают... ©

Автор: Lazin 11.7.2008, 22:06
Цитата(vinter @  11.7.2008,  20:57 Найти цитируемый пост)
нельзя, это запрещено стандартом. 

можно

Добавлено через 1 минуту и 57 секунд
попробуй написать что то вроде этого:
Код

std::vector< std::auto_ptr<A> > v;

код скомпилируется но работать не будет, вернее работать он будет, но не так как нужно smile 
а так как не нужно smile 

Автор: vinter 11.7.2008, 22:52
Цитата(Lazin @  11.7.2008,  23:06 Найти цитируемый пост)
код скомпилируется но работать не будет, вернее работать он будет, но не так как нужно  

попробуй, студия это не компилит. компилит :( 
Цитата(Ulysses4j @  11.7.2008,  22:51 Найти цитируемый пост)
ANSI ISO/IEC 14882:1998, 20.4.5 par. 3.А мужики-то не знают... 

никогда не читал стандарт, подобное написано то ли у Майерса, то ли у Джосьюттиса, то ли у Страуструпа, мне их слова достаточно,чтобы   не рыскать по стандарту.
Цитата(Lazin @  11.7.2008,  23:06 Найти цитируемый пост)
код скомпилируется но работать не будет

очень странно, я знаю точно что у меня такое не компилилось, сейчас проверил в 2008 студии - схавало

Автор: Ulysses4j 11.7.2008, 23:03
Поскольку то, что ты сказал, абсолютно неверно, то и читая Мейерса-Джасттиса-Страуструпа, ты просто не смог верно понять их слов. А со ссылками на то, чего не читал, я был бы поаккуратней.

Автор: vinter 11.7.2008, 23:11
Цитата(Ulysses4j @  12.7.2008,  00:03 Найти цитируемый пост)
Зачем ссылаться на Стандарт, если никогда его не читал — это невежество

лечить меня не надо  smile 
Цитата(Ulysses4j @  12.7.2008,  00:03 Найти цитируемый пост)
Поскольку то, что ты сказал, абсолютно неверно,

да ну? апрям таки абсолютно? если написано
Цитата(Ulysses4j @  11.7.2008,  22:51 Найти цитируемый пост)
undefined behavior.
, это всего лишь значит, что не смогли придумать как по человечески поставить заглушку, на использование этого класса в контейнерах. Так что это как минимум синоним запрета. А в книгах я видимо видел, что собираются внести в стандарт, или нечто подобное, что отложилось в памяти как запрещено стандартом smile я не прав немного в формулировке, но сути это  не меняет, 

Автор: 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
Цитата(varnie @  11.7.2008,  12:59 Найти цитируемый пост)
читай http://www.gotw.ca/publications/using_auto...effectively.htm
подобное сделать нельзя (и хороший компилятор должен адекватно об этом известить).
почему нельзя -- читай статью. тема много где обсуждалась.
вместо этого используй std::vector< boost::shared_ptr<T> > или подобное, но не с std::auto_ptr

Спасибо за ответ.
Цитата(mrbrooks @  11.7.2008,  15:01 Найти цитируемый пост)
все нормально имхо  smile  smile впринципе это может кому нибудь и по надобится. 

+1.

Сэкономил время.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)