2013-10-09 55 views
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。

+4

它是否像'typedef int VectorType :: value_type :: * MMM'一样工作? –

+2

@KerrekSB我相信你应该把它变成一个答案,'typename'在这里显然是多余的(在'::'右边没有标识符)。 – Angew

+2

@Angew:这不仅仅是多余的*。在那里使用'typename'是不正确的。 – Nawaz

回答

2

正如在评论中指出,你有一个typename它不应该是:

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

应该仅仅是:当你有a::b模板内

typedef int VectorType::value_type::* MMM; 

typename使用,a取决于模板参数,b是一种类型。在这种情况下,您必须使用typename a::b将此事实传达给编译器。

另一方面,你在做a::b::*,这是一个明确的指标,b必须是一个类型,所以typename不能在这里使用。