我正在尝试编写一个容器适配器。我也想在派生类中使用基类的类型定义。所以我尝试了以下...

template <class CONTAINER> class SequenceComposite {
protected:
    CONTAINER m_data;
public:
    typedef typename CONTAINER::size_type size_type;
    // ...
};

template <class DTYPE>
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> > {
public:
    size_type capacity() const { m_data.capacity(); }
    // ...
};

我收到此错误...
error: ‘size_type’ does not name a type
note: (perhaps ‘typename SequenceComposite<std::vector<T> >::size_type’ was intended) // yes, it was

如何告诉编译器我要使用基类的typedef?

最佳答案

我能够使它工作,这是有关Dependent name lookup for C++ templates的好文章,并且this涵盖了如何使用m_data解决问题:

template <class DTYPE>
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> >
{
public:
     typedef typename SequenceComposite< std::vector<DTYPE> >::size_type size_type ;

     size_type capacity() const
        {
          this->m_data.capacity() ;
        }
    // ...
};

另外,您也可以使用using:
using typename SequenceComposite< std::vector<DTYPE> >::size_type ;

尽管我认为这不会做得更好,但是jrok提出了一个更好的解决方案:
 typename VectorComposite::size_type capacity() const
 {
    this->m_data.capacity() ;
 }

10-04 15:08