代码之家  ›  专栏  ›  技术社区  ›  puchu

继承器类中的G++typedef模板

  •  1
  • puchu  · 技术社区  · 14 年前

    简化我的问题,我们可以考虑:

    template <class T>
    class Base{
        typedef typename std::pair<T, T> pair;
    };
    
    template <class T>
    class Inheritor : public Base<T> {
        pair *p;                          
        // mean that we want to use constructor of std::pair.
        // say: std::pair withou argument list
    
        Inheritor<T>::pair *p;
        // dont see his typename
        // say: pair does not name a type
    
        typename pair *p;
        // I was sure that it works.
        // I dont know why it doesnt work.
        // say: expected nested-name-specifier before 'pair
    
        typename Inheritor<T>::pair *p;
        // ok!
    };
    

    为什么我们不能写“类型名对”*P?我不明白继承人的原因::!它使代码变得更复杂和不好阅读!

    聚苯乙烯 (公开的)。就像我说的“简化我的问题……”

    typedef typename Base<T>::pair pair;
    

    在我看来,这是一个…很难翻译的俄语单词 ("костыль")

    它看起来像是Kludge或Duct Tape或Hack=)

    据我所知:

    typedef继承通常的函数或变量。 但它是不可接近的(!!!!). 为了接近它,我们应该写

    typedef typename base<t>::对;
    

    typedef typename Inheritor<T>::pair pair;
    

    看起来很有趣 Hindu code 但我们需要它!(& gt;& lt;)

    公共范围内的勇气

    1 回复  |  直到 13 年前
        1
  •  3
  •   GManNickG    14 年前

    当类型名称依赖于模板参数时,它是 从属名 . You have to use typename to indicate you're naming a type. 读那篇文章,你就会看到 类别名 没有意义,除了最后一种情况。

    下面是您的代码可能的外观:

    template <class T>
    class Base
    {
    public: // you probably don't want a private typedef
        typedef std::pair<T, T> pair; // typename isn't needed here, this isn't dependent
    };
    
    template <class T>
    class Inheritor : public Base<T>
    {
    public: // public again
        typedef typename Base<T>::pair pair; // get the Base's pair type, typedef it
    
        pair *p; // ah, easy to use
    };