派生类中的类型定义未知

typedef unknown in derived class

本文关键字:定义 未知 类型 派生      更新时间:2023-10-16

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

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

我如何告诉编译器我想从基类中使用类型定义?

我能够做到这一点,这里有一篇关于c++模板的依赖名称查找的好文章,它涵盖了如何解决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() ;
 }

在派生类型的上下文中,size_type是一个非依赖的名称,因此它将在模板的上下文中查找,而不实例化基模板。如果需要使用它,最简单的方法是克隆派生类型中的类型定义:

typename VectorComposite::size_type size_type; // [*]

[*]按照jrok对原始错误代码的修复

这样放置base的size_type:

typename SequenceComposite<std::vector<DTYPE>>::size_type capacity() const{ //..
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~