2

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

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?

4

3 回答 3

4

我能够让它工作,这是一篇关于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() ;
 }
于 2013-03-11T13:08:02.470 回答
2

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

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

[*]遵循 jrok 对原始错误代码的修复。

于 2013-03-11T13:09:00.940 回答
1

size_type以这种方式放置基地:

typename SequenceComposite<std::vector<DTYPE>>::size_type capacity() const{ //..
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
于 2013-03-11T12:58:01.067 回答