2010-03-21 49 views
3

我有一個模板類像這裏(在報頭)的具有內部類的靜態成員和類型的指針到內部類的靜態成員C++定義與型內類指針模板類

template <class t> class outer { 
    class inner { 
     int a; 
    }; 

    static inner *m; 
}; 

template <class t> outer <t>::inner *outer <t>::m; 

當我想定義靜態成員我說:「錯誤:預期的構造函數,析構函數或類型轉換之前'*'標記」在最後一行(mingw32-g + + 3.4.5)

+0

您對空格的使用使最後一行令人難以置信,難以正確讀取。我必須花一點時間思考它的意義。基本上,你可以拆分屬於一起的東西(typename,模板參數,指針限定符),並將不同的東西粘在一起(指針限定符,變量名)。 –

回答

4

您需要限定的inner類是typename,因爲它依賴於模板參數,並且C++編譯器假定在該上下文中,名稱是inner一個類型:

template <class t> typename outer<t>::inner* outer<t>::m; 

理由:名稱inner在上面的行取決於類型名稱,t。此時C++編譯器不知道inner是什麼,因爲名稱inner的含義可能因t而異。例如,假設在代碼別的地方,還有就是outer類爲int一個專門的版本:

template <> 
class outer<int> { 
    int inner; 
}; 

現在,outer<int>::inner不再名稱的類型;它命名一個成員變量。

因此,在一般情況下outer<t>::inner含義將是不明確的,C++解決這種模糊性假設inner確實名稱的類型。除非你說明,否則加上typenametypename outer<t>::inner。 (在這種情況下,inner被稱爲從屬名稱,因爲它取決於t的確切類型。)