В чем отличие forward_list::iterator от _Fwd_list_iterator?

Вероятно, туплю, но не могу понять, в чем дело.
Следующий код без проблем компилируется:
#include <forward_list>
template<typename T>
class Foo
{
    std::_Fwd_list_const_iterator<T> cur;
    //...
};

А вот следующий выдает ошибку:
#include <forward_list>
template<typename T>
class Foo
{
    std::forward_list<T>::const_iterator cur;
    //...
};

$ g++ -c -std=c++11 1.cpp
1.cpp:5:5: error: need ‘typename’ before ‘std::forward_list<T>::const_iterator’ because ‘std::forward_list<T>’ is a dependent scope
     std::forward_list<T>::const_iterator cur;
     ^

$ clang++ -c -std=c++11 1.cpp
1.cpp:5:5: error: missing 'typename' prior to dependent type name 'std::forward_list<T>::const_iterator'
    std::forward_list<T>::const_iterator cur;
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    typename 
1 error generated.

Fwd_list_const_iterator определен в libstdc++ вот так: (см https://gcc.gnu.org/onlinedocs/gcc-4.6.4/libstdc++...
typedef _Fwd_list_const_iterator<_Tp>           const_iterator;

Есть идеи?
  • Вопрос задан
  • 2703 просмотра
Решения вопроса 2
@malerix
Компилятор вам подсказывает: нужно добавить "typename".
Вот тут можно почитать об этом.
Это работает:
#include <forward_list>
template<typename T>
class Foo
{
    typename std::forward_list<T>::const_iterator cur;
};
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Дело в том, что по конструкции
std::_Fwd_list_const_iterator<T> cur
компилятору понятно, что перед cur -- имя типа. Во втором случае что такое const_iterator можно будет понять только в точке инстанцирования cur. Поэтому компилятор просит добавить строгости, в виде ключевого слова typename. Всё правильно делает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Hertz
_Fwd_list_const_iterator это внутренние детали реализации libstdc++, Вы вообще им пользоваться не должны.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы