【问题标题】:typedef unknown in derived class派生类中的 typedef 未知
【发布时间】:2013-03-11 12:55:47
【问题描述】:

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

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?

【问题讨论】:

    标签: c++ templates inheritance typedef


    【解决方案1】:

    我能够让它工作,这是一篇关于 Dependent name lookup for C++ templatesthis 的好文章,介绍了如何解决 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() ;
     }
    

    【讨论】:

    • 嗯......这不是故意的。这意味着重新定义所有已经定义的类型。
    • @Michael 你也可以使用using,我也添加了那个例子。
    • @Michael jrok建议的解决方案更好
    • 有趣的是 class MyModel : public virtual VectorComposite&lt;double&gt; { public: explicit MyModel(size_type n) : VectorComposite&lt;double&gt;(n) {} }; 有效,无需重新定义 size_type
    • @Michael 那是因为它没有模板化,如果你做了模板 class MyModel .... 那么你会遇到同样的问题。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我是否遗漏了一些我无法使该语法工作的东西,我必须使用我的示例中的语法才能使其工作。
    • @ShafikYaghmour:你说得对,注入的名字不能直接使用。删除答案。
    • 我只是修改它,你最初的解释比我的要好得多。
    • typedef typename VectorComposite::size_type size_type; 确实有效。
    • @jrok:在没有类型名的情况下有效,因为它将非依赖名称转换为依赖名称,查找被推迟到参数替换后的第二阶段,并且将查找基本类型起来。
    【解决方案3】:

    把base的size_type这样放:

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

    【讨论】:

    • typename VectorComposite::size_type capacity() const { this-&gt;m_data.capacity(); } 也可以
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2011-11-09
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2013-07-11
    相关资源
    最近更新 更多