[英]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.