2013-10-09 74 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不能在這裏使用。