c++ - 具有可变参数模板的递归继承和继承参数问题

标签 c++ inheritance variadic-templates

如果我像下面的例子那样使用继承链,我可以毫无问题地从最深的基础使用变量:

    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/

相关文章:

c++ - 我可以将成员函数传递给 mu::Parser::DefineFun() 吗?

java - 在扩展父类(super class)功能的同时屏蔽它

javascript - 在 JavaScript 中努力处理继承和原型(prototype)设计 - 原型(prototype)方法不像 "should"那样工作

c++ - 无参数可变参数模板的模糊重载

c++ - 可变参数模板模板参数

c++ - 将负数存储在无符号整数中

c++ - 声明包含模板的结构的链接列表

c# - 将 std::string 从 C++ DLL 返回到 C# 程序 -> 指定给 RtlFreeHeap 的地址无效

svn - 继承svn :ignore properties in a subfolder doesn't work

c++ - 元组到参数包