Общество любителей CФорум

Трудности с шаблонами.

#0
16:00, 31 июля 2006

Я застрял с изучением Страуструппа на этом фрагменте. Язык С++, 4-е издание(фрагмент набит из
3-го издания, т.к. в нем нет опечатки), 14-я глава. Шаблон из Библиотеки С++.
Я в шаблоны с трудом въезжаю. Понятно его назначение, по контексту где он взят, и по примерам
его использования, - реализация деструктивного копирования. Но не пойму роль структуры/класса
auto_ptr_ref. С операторами преобразования(приведения) то-же какая-то несвязуха в голове.
  Есть ли кто среди вас, кто бы популярно "расписал" как это шаблон действует.
Я отметил символом ?, строки с членами, назначение которых меня особенно "напрягают".

    Благодарю за помощъ. Я здесь немного подправлю, доведу до ума, если получится со временем
все подробно распишу, по частям. Буду признателен если кто зделает какие-либо замечания.


template <class X> class std::auto_ptr {
?  template <class Y> struct auto_ptr_ref { /* ... */ };  // helper class
  X* ptr;

public:
  typedef X element_type;

  explicit auto_ptr(X* p=0) throw() { ptr=0; }
  auto_ptr(auto_ptr& a) throw{} { ptr=a.ptr; a.ptr=0; }  // note: not const auto_ptr&
?  template <class Y> auto_ptr (auto_ptr <Y>& a) throw() { ptr=a.ptr; a.ptr=0; }
  auto_ptr& operator=(auto_ptr& a) throw() { ptr=a.ptr; a.ptr=0; }
/-/-/  template<class Y> auto_ptr& operator=(auto_ptr<Y>& a) throw() { ptr=a.ptr; a.ptr=0; }
  ~auto_ptr() throw() { delete ptr; }

  X& operator*() const throw() { return *ptr; }
  X* operator->() const throw() { return ptr; }
  X* get() const throw() { return ptr; }      // extract pointer
  X* release() throw() { X* t = ptr; ptr=0; return 1; }  // relinquish ownership
  void reset(X* p = 0) throw() { if(p != ptr) { delete ptr; ptr=p; }}

?  auto_ptr(auto_ptr_ref<X>) throw();      // copy from auto_ptr_ref
?  template<class Y> operator auto_ptr_ref<Y> () throw();  // copy from auto_ptr_ref
?  template<class Y> operator auto_ptr<Y> () throw();  // destructive copy from auto_ptr
};


-------------------------------------------------------------------------------------------------


class BASE {};

class DERIVED : public BASE {};

void function()
{

    auto_ptr<DERIVED> apD;
/*
    параметризация X по DERIVED, разрешение перегрузки конструкторов:
       
        explicit auto_ptr(X/*DERIVED*/* p=0) throw() { ptr=0; }

? # 1. Конструкторы копий учавствуют в данном разрешении?
? # 2. По логике получается что ниже конструктор копий, но он с неконстантной ссылкой, как его
    трактует компилятор в данном разрешении, как конструктор копий?
        auto_ptr(auto_ptr& a) throw() { ptr=a; a.ptr=0; }

? # 3. Аргумента нет, и шаблон ниже в разрешении не учавтвует? 
  template<class Y> auto_ptr (auto_ptr<Y>& a) throw { ptr=a.ptr; a.ptr=0; }

        auto_ptr(auto_ptr_ref<X/*DERIVED*/>) throw ();


    Вызавается explicit auto_ptr(DERIVED* p=0)

*/


    auto_ptr<BASE> apB(apD);
/*
    Параметризация X по BASE, разрешение перегрузки конструкторов:
? # 4. Здесь в разрешении, учавствуют все конструкторы или только конструкторы копий?

        explicit auto_ptr(X /*BASE*/ p=0) throw() { ptr=0; }
        auto_ptr(auto_ptr& a) throw() { ptr=a; a.ptr=0; }
 
    по инициализатору выводится аргумент параметра, члена шаблона Y, - DERIVED
        template<class Y> auto_ptr(auto_ptr<Y /*DERIVED*/>& a) throw() { ptr=a.ptr: a.ptr=0; }


? # 5. Я так понимаю здесь возможно приведение?
        auto_ptr(auto_ptr_ref<X/*BASE*/>) throw();

*/

    auto_ptr<BASE> apB1;

    auto_ptr<DERIVED> apD1( apB1 );  // Ошибка

/*
*
*
*
*/


}

#1
16:38, 31 июля 2006

SpaceMarine
Пости пожалуйста подобные сообщения ТОЛЬКО в форум.

в Visuаl Studio отличий auto_ptr_ref от auto_ptr& нет.

Я задавал тотже вопрос: http://www.gamedev.ru/code/forum/?id=33222

Еще можно посмотреть здесь: http://beliaevs.livejournal.com/25009.html?mode=reply

#2
21:53, 31 июля 2006

PP
Спасибо! Я пока пропаду на этих ссылках, еще раз спасибо.

Общество любителей CФорум

Тема в архиве.