Şablon soyut sınıfından devralma

Nov 24 2020

Bu kod yapısına sahibim:

  • Soyut bir A sınıfı (saf bir sanal yönteme sahiptir)
  • A'dan devralan bir sınıf şablonu B
  • B'den devralan bir C sınıfı şablonu
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;
    };
};

Derlediğimde şu hatayı alıyorum:

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

uAçıkça C'nin bir öğesi olsa da , A, C'den B'ye kadar olan bir temeldir.

Burada okudum: Sınıf şablon devralma C ++ sınıf şablonundan miras almanın uygun yolu ya sınıfı uzmanlaştırmak ya da miras alınan sınıfın şablon olmasını sağlamaktır ve burada yaptığım şey buydu. Derleyici zaten bundan şikayetçi görünmüyor. A'nın soyut bir sınıf olması olabilir mi?

Neyi yanlış yaptım?

Teşekkürler!

Yanıtlar

1 AmiTavory Nov 24 2020 at 16:08

Bu, bağımsız olmayan bir adla ilgili bir sorundur - atıfta bulunduğunuz üye şablon parametresine bağlı değildir. Derleyici, bağımsız B<T>adlar (gibi u) ararken bağımlı temel sınıflara (benzer ) bakmaz .

Kullanarak çözebilirsiniz

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

hangi derleyiciyi ukastettiğinizi belirtir .

( coliru )

Bu satırdan önce işlevi çağırarak B<T>::uveya yazarak en az iki yol using B<T>::u;daha vardır.

Bununla ilgili daha fazlasını buradan okuyun .