读C++ STL源码时遇见的一个问题,同样的类为什么定义两次?

 // Base class for ordinary allocators.
template <class _Tp, class _Allocator, bool _IsStatic>
class _Vector_alloc_base {
public:
  typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type
          allocator_type;
  allocator_type get_allocator() const { return _M_data_allocator; }

  _Vector_alloc_base(const allocator_type& __a)
    : _M_data_allocator(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0) 
  {}

protected:
  allocator_type _M_data_allocator;
  _Tp* _M_start;
  _Tp* _M_finish;
  _Tp* _M_end_of_storage;

  _Tp* _M_allocate(size_t __n)
    { return _M_data_allocator.allocate(__n); }
  void _M_deallocate(_Tp* __p, size_t __n)
    { if (__p) _M_data_allocator.deallocate(__p, __n); }
};

// Specialization for allocators that have the property that we don't
// actually have to store an allocator object.  
template <class _Tp, class _Allocator>
class _Vector_alloc_base<_Tp, _Allocator, true> {
public:
  typedef typename _Alloc_traits<_Tp, _Allocator>::allocator_type
          allocator_type;
  allocator_type get_allocator() const { return allocator_type(); }

  _Vector_alloc_base(const allocator_type&)
    : _M_start(0), _M_finish(0), _M_end_of_storage(0) 
  {}

protected:
  _Tp* _M_start;
  _Tp* _M_finish;
  _Tp* _M_end_of_storage;

  typedef typename _Alloc_traits<_Tp, _Allocator>::_Alloc_type _Alloc_type;
  _Tp* _M_allocate(size_t __n)
    { return _Alloc_type::allocate(__n); }
  void _M_deallocate(_Tp* __p, size_t __n)
    { _Alloc_type::deallocate(__p, __n);}
};

这里class _Vector_alloc_base为什么被定义了两次?
还有就是第二次定义class _Vector_alloc_base<_Tp, _Allocator, true>时,class+类名+<>的写法是什么意思?

你可以这么理解,当第一次push_back的时候用了默认的。而第二次push_back的时候,发现vector默认的内存不够了,于是push_back重新删掉以前的内存
(vector的特性是数组,所以要保持内存连续,如果有新增的内存,那么每次新增必须删掉以前的内存,再重新new出新的能容纳新增的内存)。
所以会出现你这个情况,第一次push_back内存够了。第二次push_back内存不够,删掉以前的t1内存(发生t1的析构)。然后再创建一个能容纳ti t2的新内存

上面是解释你push_back。
而delete vec_Teacher;这句会把所有的内存删掉(就是t1 t2 都析构掉)

以上就是解释为什么,会出现俩次t1的析构和一次t2的析构。

自己搞定了,模板特化问题

当第一次push_back的时候用了默认的。而第二次push_back的时候,发现vector默认的内存不够了,于是push_back重新删掉以前的内存

push_back的时候用了默认的。而第二次push_back的时候,发现vector默认的内存不够了,于是push_back重新删掉

第一次默认,第二次发现默认的不够用或者达不到要求,所以重新定义