如果我像下面的例子那样使用继承链,我可以毫无问题地从最深的基础使用变量:
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
在这种情况下是从属名称,因此您必须访问 if as this->x
(或通过在您的类定义中放置一个 using 声明将其纳入范围:
using Example<Params...>::x;
编辑
标准的 [temp.res] 中讨论了这样做的原因。基本上:当编译器解析您的模板时,它只会看到 x
.它无法知道 x
取决于模板的参数(在您的情况下它会这样做,因为它来自依赖于它们的基类)。因此,编译器尝试解析 x
在解析模板时使用它所知道的,但失败了。
写作 this->x
表示 x
指类(class)的成员;由于您的特定类的基类取决于模板参数,因此编译器知道它无法解析 x
在解析模板时,会推迟解析,直到模板被实例化。那时,模板参数是已知的。
using Example<Params...>::x;
也是如此.这也告诉编译器 x
依赖于模板参数,其解析必须延迟到实例化。
关于c++ - 具有可变参数模板的递归继承和继承参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13377692/