Şablon soyut sınıfından devralma
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
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 .