テンプレート抽象クラスから継承

Nov 24 2020

私はこのコード構造を持っています:

  • 抽象クラス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;

しかしは、uAがBを介してCのベースであるため、明らかにCの要素であります

私はここを読みました:クラステンプレートから継承する適切な方法は、クラスを特殊化するか、継承されたクラスをテンプレートにすることです。これは私がここで行ったことです。コンパイラはとにかくそれについて文句を言うようには見えません。Aが抽象クラスだからでしょうか?

私は何を間違えましたか?

ありがとう!

回答

1 AmiTavory Nov 24 2020 at 16:08

これは、依存しない名前の問題です。参照しているメンバーは、テンプレートパラメーターに依存しません。コンパイラは、依存しないB<T>名前(などu)を検索するときに、依存する基本クラス(など)を検索しません。

あなたはそれを使用して解決することができます

this->u = this->u + qrqr;

これはuあなたが意味するコンパイラに指定します。

(コリル)

を呼び出すB<T>::uか、using B<T>::u;この行の前に関数を書き込むという、少なくとも2つの方法があります。

詳しくはこちらをご覧ください。