g ++ typedef шаблоны в классе-наследнике - PullRequest
1 голос
/ 14 октября 2010

Упрощая мою проблему, мы можем рассмотреть:

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?Я не понимаю причины наследования ::!это делает код более сложным и плохим для чтения!

PS (конечно, публично. как я говорю "упрощаю мою проблему ...")

typedef typename Base<T>::pair pair;

На мой взгляд, это... русское слово, которое трудно перевести ("костыль")

Это похоже на Kludge или клейкую ленту или хак =)

Как я понимаю:

typedefs наследуют как обычную функцию или переменную.но это не доступно (!!!).чтобы получить доступ к нему, мы должны написать

typedef typename Base<T>::pair pair;

или

typedef typename Inheritor<T>::pair pair;

это выглядит смешно индуистский код но нам это нужно!(> _ <) '' '' </p>

курса в открытом доступе

1 Ответ

3 голосов
/ 14 октября 2010

Когда имя типа зависит от параметра шаблона, это зависимое имя . Вы должны использовать typename, чтобы указать, что вы называете тип. Прочтите эту статью, и вы увидите, что использование typename не имеет смысла, за исключением последнего случая. 1007 *

Вот как должен выглядеть ваш код:

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
};
...