Я должен объявить 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)
typedef
нельзя использовать для объявления Iter
? Почему бы и нет?Iter
в пределах template
class
? (например, как тип параметра функции)РЕДАКТИРОВАТЬ
В инструкции typename Vec::iterator Iter;
ключевое слово typename
говорит Vec::iterator
является типом (то есть не статической функцией / атрибутом-членом). Следовательно, Iter
не объявлен как тип, но как переменная, использующая тип Vec::iterator
,
typedef
можно использовать вместе typename
, Так и становится:
typedef typename vec::iterator Iter;
Просто используйте Iter
сейчас.
template <typename T>
struct MyContainer
{
typedef std::vector<T> Vec;
typedef typename Vec::iterator Iter;
void Foo (Iter); //ok
Iter Bar (); //ok
};
Просто чтобы добавить к предыдущему ответу …
typename Vec::iterator Iter;
является допустимым оператором C ++, который объявляет не тип, а переменную с именем Iter
,
Ключевое слово typename
был введен, чтобы указать, что следующий идентификатор является типом. При разборе Vec::iterator
компилятор не может распознать, что iterator
означает тип, потому что это шаблонно-зависимое имя. Это может быть также статический член данных в Vec
,
Эта строка:
typename Vec::iterator Iter;
Объявляет переменную-член с именем Iter
типа Vec::iterator
(Т.е. vector<T>::iterator
), а не тип.
Глядя на то, что вы сделали после этого, вы, вероятно, имели в виду:
typedef typename Vec::iterator Iter;