Учти это:
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.
Как указано в комментариях, у вас есть 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
нельзя использовать здесь.