Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вектор из auto_ptr <T>, не получается создать сабж :-[ 
:(
    Опции темы
Станислав
Дата 20.5.2002, 13:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











кто-нибудь пробовал создать такую очень полезную вещь, как контейнер, содержащий автоматические узазатели на объекты?
если да, то опишите, плз., как вы это делали?

у меня проблема. вот мой фрагмент:
//-----------------------------------------------------------------------------
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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: 0
Всего: 0



читай http://www.gotw.ca/publications/using_auto...effectively.htm
подобное сделать нельзя (и хороший компилятор должен адекватно об этом известить).
почему нельзя -- читай статью. тема много где обсуждалась.
вместо этого используй std::vector< boost::shared_ptr<T> > или подобное, но не с std::auto_ptr
PM MAIL   Вверх
vinter
Дата 11.7.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



varnie, не хорошо сообщения накручивать, занимаясь некропостингом..


--------------------
Мой блог
PM MAIL WWW   Вверх
varnie
Дата 11.7.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.9.2007

Репутация: 0
Всего: 0



vinter
верите нет, мне по-барабану на все эти статусы и прочие финтифлюшки=) я бы их вообще все отменил, была бы моя воля...
то что я ответил на старый пост я уже сам понял, но уже после того как отпостил ответ. если бы вы обратили внимание, то увидели бы что я новичок на этом форуме (неск. дней всего здесь, ввиду хорошего коммунити по с++), а потому нек. оплошности, думаю, мне простительны на первых порах. а ответил я потому, что нашел тему без ответа, и решил, что будет полезно ответить. вотс.

ps: с замечанием в принципе согласен, впредь буду обращать внимание на "устаревшесть" топиков.
PM MAIL   Вверх
mrbrooks
Дата 11.7.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



все нормально имхо  smile  smile впринципе это может кому нибудь и по надобится.
PM MAIL   Вверх
Lazin
Дата 11.7.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

можно, поскольку у std::auto_ptr есть конструктор копирования и оператор присваивания, другое дело, что результат будет не тем, который ожидается smile 
PM MAIL Skype GTalk   Вверх
vinter
Дата 11.7.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
Ulysses4j
Дата 11.7.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



Цитата(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.

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


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Lazin
Дата 11.7.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

можно

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

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

код скомпилируется но работать не будет, вернее работать он будет, но не так как нужно smile 
а так как не нужно smile 
PM MAIL Skype GTalk   Вверх
vinter
Дата 11.7.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(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 студии - схавало

Это сообщение отредактировал(а) vinter - 11.7.2008, 23:19


--------------------
Мой блог
PM MAIL WWW   Вверх
Ulysses4j
Дата 11.7.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



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

Это сообщение отредактировал(а) Ulysses4j - 11.7.2008, 23:05


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
vinter
Дата 11.7.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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

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



--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 11.7.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



В книжках говорится о том, что std::auto_ptr можно и нужно использовать, но для хранения в стандартных контейнерах он не предназначен. Поэтому не надо пытаться делать из них вектор или что-нибудь еще, так как результат может быть любым.
PM   Вверх
Ulysses4j
Дата 12.7.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



bsa, мы, видимо, разные книжки читаем. Те книжки, которые читал я, говорили, что это довольно дурацкий класс и пирменять его имеет смысл, когда нужны строгие гарантии относительно исключений, а по возможности лучше пользоваться умными указателями с более прозрачным поведением.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
JackYF
Дата 12.7.2008, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Ссылкой не подтвержу, но, ЕМНИП, использовать std::auto_ptr в контейнерах STL либо не рекомендуется, либо запрещено. Из-за copy-destructive семантики.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.