шаблонный класс вложенного типа typename

Я должен объявить Iter как typename но нет typedef,
Тогда я не могу использовать Iter в моем template class декларация => разочарование 🙁
Пожалуйста, научите меня, как использовать Iterили же объясните мне, почему C ++ так противный

template <typename T>
struct MyContainer
{
typedef  std::vector<T>  Vec;
typename Vec::iterator   Iter;

void Fo (typename std::vector<T>::iterator);  //ok
typename std::vector<T>::iterator Ba();       //ok

void Foo (Iter);   //error: 'Iter' is not a type
Iter Bar ();       //error: 'Iter' does not name a type
};                   //(gcc 4.1.2)
  1. Зачем typedef нельзя использовать для объявления Iter? Почему бы и нет?
  2. Как пользоваться Iter в пределах template class? (например, как тип параметра функции)

РЕДАКТИРОВАТЬ
В инструкции typename Vec::iterator Iter; ключевое слово typename говорит Vec::iterator является типом (то есть не статической функцией / атрибутом-членом). Следовательно, Iter не объявлен как тип, но как переменная, использующая тип Vec::iterator,

1

Решение

  1. typedef можно использовать вместе typename, Так и становится:

    typedef typename vec::iterator Iter;
    
  2. Просто используйте Iter сейчас.

    template <typename T>
    struct MyContainer
    {
    typedef  std::vector<T>         Vec;
    typedef typename Vec::iterator  Iter;
    
    void Foo (Iter);   //ok
    Iter Bar ();       //ok
    };
    
7

Другие решения

Просто чтобы добавить к предыдущему ответу …

typename Vec::iterator   Iter;

является допустимым оператором C ++, который объявляет не тип, а переменную с именем Iter,

Ключевое слово typename был введен, чтобы указать, что следующий идентификатор является типом. При разборе Vec::iteratorкомпилятор не может распознать, что iterator означает тип, потому что это шаблонно-зависимое имя. Это может быть также статический член данных в Vec,

Официально, что такое typename?

1

Эта строка:

typename Vec::iterator   Iter;

Объявляет переменную-член с именем Iterтипа Vec::iterator (Т.е. vector<T>::iterator), а не тип.

Глядя на то, что вы сделали после этого, вы, вероятно, имели в виду:

typedef  typename Vec::iterator   Iter;
0
По вопросам рекламы [email protected]