Указатель на имя пользователя

0

Учти это:

template < typename VectorType >
void ff()
{
    // This passes.
    typedef typename VectorType::value_type VV;
    typedef int VV::* MM;

    // This FAILS!??
    typedef int typename VectorType::value_type::* MMM;
}

Почему вторая терпит неудачу и каков правильный способ получить желаемый typedef в одной инструкции typedef?

Мой компилятор - GCC-4.7.2.

Теги:
templates
typename
pointer-to-member
gcc4.7

1 ответ

2
Лучший ответ

Как указано в комментариях, у вас есть typename где это не должно быть:

typedef int typename VectorType::value_type::* MMM;

должен быть справедливым:

typedef int VectorType::value_type::* MMM;

typename используется, когда у вас есть a::b внутри шаблона, a зависит от параметров шаблона, а b - типа. В этом случае вы должны использовать typename a::b чтобы передать этот факт компилятору.

С другой стороны, вы делаете a::b::*, что является ясным индикатором того, что b должен быть типом, поэтому typename нельзя использовать здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню