我正在尝试编写容器适配器。我想在派生类中使用基类中的类型定义。所以我尝试了以下......
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?
答案 0 :(得分:4)
我能够将其发挥作用,这是一篇关于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() ;
}
答案 1 :(得分:2)
在派生类型的上下文中,size_type
是一个非依赖名称,因此它将在模板的上下文中查找,而不实例化基本模板。如果你需要使用它,最简单的方法是克隆派生类型中的typedef:
typename VectorComposite::size_type size_type; // [*]
[*] 继jrok修复原始错误代码之后。
答案 2 :(得分:1)
以这种方式放置基数size_type
:
typename SequenceComposite<std::vector<DTYPE>>::size_type capacity() const{ //..
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~