簡體   English   中英

具有可變參數模板和繼承參數問題的遞歸繼承

[英]Recursive inheritance with variadic templates and inherited parameter problems

如果我像下面的例子那樣使用一系列繼承,我可以使用來自最深基礎的變量而沒有任何問題:

    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; }
    };

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

在這種情況下, x是一個從屬名稱,所以你必須訪問this->x (或者通過在類定義中放入using聲明將其帶入范圍:

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

編輯

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

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

using Example<Params...>::x; 這也告訴編譯器x取決於模板參數,並且其分辨率必須推遲到instanitation。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM