【问题标题】:C++ templated class self-inheritanceC++模板类自继承
【发布时间】:2018-01-16 05:18:13
【问题描述】:

我有这个代码:

template<typename A, typename B = A>
class MyClass;

template<typename A>
class MyClass<A, void>
{
protected:
    A a;

    MyClass<A, void>(const A& a):
        a(a)
    {}
public:
    const A& getA() const
    {
        return a;
    }
};

template<typename A, typename B>
class MyClass : public MyClass<A, void>
{
private:
    B b;
public:
    MyClass<A, B>(const A& a, const B& b):
        MyClass<A, void>(a), b(b)
    {}

    const B& getB() const
    {
        return b;
    }

    const auto getAplusB() const
    {
        return a+b;
    }
};

getAplusB 方法无法编译并显示消息 a is not declared。但是,继承似乎有效,所以我可以使用this-&gt;getA() + b。我也尝试过dynamic_cast&lt;const MyClass&lt;A, void&gt;*&gt;(this)-&gt;a + b,但遇到了另一个编译错误a is protected。我在这里错过了什么?

【问题讨论】:

  • 显然,将a 更改为this-&gt;a 有效...
  • @user202729 好点。它解决了我的问题,但我仍在等待可以解释这一点的人。
  • 已经在下面的答案中了。
  • 是的,我现在知道了,我刷新页面时它不在这里

标签: c++ oop templates inheritance


【解决方案1】:

您只需使用this-&gt;a限定名称 MyClass&lt;A, void&gt;::a。这是因为a 是基础class-template 的成员。有一种叫做name lookup 的东西 - 当编译器看到name 时,它会执行上述name lookup

仅仅尝试进行不合格的访问a 将不起作用,因为它是dependent name(其含义取决于某处某个模板的实例化)。因此,您必须限定对a的访问权限

【讨论】:

  • 您也可以在privateprotected 部分下直接说using MyClass&lt;A, void&gt;::a;,然后照常使用。
猜你喜欢
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多