2013-10-09 5 views
0

Рассмотрим это:Указатель на член TypeName

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

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

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

+4

Работает ли он как 'typedef int VectorType :: value_type :: * MMM'? –

+2

@KerrekSB Я считаю, что вы должны обратить это на ответ, «typename» явно избыточно там (нет идентификатора справа от '::'). – Angew

+2

@Angew: Это не просто * лишний *. Неправильно использовать 'typename' там. – Nawaz

ответ

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 не может быть использован здесь.

Смежные вопросы