2012-11-14 30 views
6

如果我使用繼承鏈,如下面的例子我可以使用從最深基礎瓦爾沒有任何問題:如果我做同樣的遞歸可變參數遞歸繼承與可變參數模板和遺傳參數問題

class A { public: int x; }; 
    class B : public A { }; 
    class C: public B { public: void Do() { cout << x << endl; } }; 

模板類我無法訪問我的變量。任何想法如何訪問變量和爲什麼我看不到我的變量?

template <class ...Parms> 
    class Example; 

    template <class Head, class ...Parms> 
    class Example<Head, Parms...>: public Example<Parms...> 
    { 
    }; 

    template <> 
    class Example<> 
    { 
     public: 
     int x; 
    }; 

    template <class ...Parms> 
    class Last: public Example<Parms...> 
    { 
     void Do() { cout << x << endl; } 
    }; 

在類的任何實例被實例化之前編譯失敗!

回答

6

x在這種情況下,相關的名字,所以你必須訪問是否爲this->x(或通過把一個using聲明在類定義中把它納入範圍:

using Example<Params...>::x; 

編輯

原因是在標準中的[temp.res]中討論過,基本上:當編譯器解析你的模板時,它只能看到x。它無法知道x取決於模板的參數你的情況,因爲它來自一個基於它們的基類)。因此,編譯器會嘗試使用解析模板時所知道的內容來解析x,並且失敗。

寫作this->x表示x是指類的成員;由於您的特定類的基類取決於模板參數,因此編譯器知道它在解析模板時無法解析x,並且會推遲解析直到模板實例化。那時候,模板參數是已知的。

這同樣適用於using Example<Params...>::x;。這也告訴編譯器,x依賴於模板參數,其解析度必須推遲到instanitation。

+0

好吧,this-> x的工作,但我必須說:我不明白訪問x和this-> x之間的差異數據成員。任何人都可以解釋*爲什麼會發生? – Klaus

+1

@Klaus我編輯了答案以提供解釋。 – Angew