【问题标题】:Inheriting from template abstract class从模板抽象类继承
【发布时间】:2020-11-24 08:49:26
【问题描述】:

我有这样的代码结构:

  • 一个抽象类 A(它有一个纯虚方法)
  • 继承自 A 的类模板 B
  • 从 B 继承的类模板 C
class A
{
protected:
    int u;
    int z;

public:
    A(int uu,
      int zz)
    :u(uu),
     z(zz)
    {};

    int get() const
    {
    return u;
    };

    virtual void blah() = 0;
};

template <class T>
class B : public A
{
protected:
    std::vector<T> xxxx;
public:
    B(int uu,
      int zz,
      int bbb)
    :A(uu,
       zz)
    {
    for(size_t i = 0; i < bbb; i ++)
        xxxx[i] = 0;
    };

    virtual void blah()
    {
    u = u + 1;
    };
};

template <class T>
class C : public B<T>
{
protected:
    int qrqr;

public:
    C(int uu,
      int zz,
      int bbb,
      int qrqrqr)
    :B<T>(uu,
          zz,
          bbb),
     qrqr(qrqrqr)
    {
    };

    virtual void blah()
    {
    u = u + qrqr;
    };
};

编译时出现此错误:

 
error: 'u' was not declared in this scope
    at line:  u = u + qrqr;

虽然u 显然是 C 的一个元素,因为 A 是 C 到 B 的基础。

我在这里读到:Class template inheritance C++ 从类模板继承的正确方法是专门化类或将继承的类作为模板,这就是我在这里所做的。编译器似乎并没有抱怨它。难道是因为A是一个抽象类?

我做错了什么?

谢谢!

【问题讨论】:

  • fwiw,我从来没有读过“虚拟类”这个词,A 是一个抽象类(因为它有一个纯虚方法)
  • 谢谢,我会改正的
  • 你错过了标题并且没有模板类,它们被称为类模板。很抱歉吹毛求疵;)

标签: c++ templates inheritance


【解决方案1】:

这是 非独立名称 的问题 - 您所指的成员不依赖于模板参数。在查找非依赖名称(如 u)时,编译器不会查看依赖基类(如 B&lt;T&gt;)。

你可以通过使用来解决它

this-&gt;u = this-&gt;u + qrqr;

它向编译器指定你的意思是u

(coliru)

至少还有另外两种方法,调用B&lt;T&gt;::u,或者在该行之前的函数中写using B&lt;T&gt;::u;

阅读更多关于它的信息here

【讨论】:

  • 我自己永远也找不到!感谢您这么快地帮我解决了我的问题!我今天学到了一些东西:)
  • 模板是B,而不是A ;)。
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多