我正在尝试编写一个容器适配器。我也想在派生类中使用基类的类型定义。所以我尝试了以下...
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() ;
}