Héritage de la classe abstraite de modèle
J'ai cette structure de code:
- Une classe abstraite A (elle a une méthode virtuelle pure)
- Un modèle de classe B qui hérite de A
- Un modèle de classe C qui hérite de B
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;
};
};
Lorsque je compile, j'obtiens cette erreur:
error: 'u' was not declared in this scope
at line: u = u + qrqr;
Bien que ce u
soit clairement un élément de C parce que A est une base de C à B.
J'ai lu ici: Héritage du modèle de classe C ++ que la bonne façon d'hériter du modèle de classe est soit de spécialiser la classe, soit d'avoir la classe héritée comme modèle et c'est ce que j'ai fait ici. Le compilateur ne semble pas s'en plaindre de toute façon. Serait-ce parce que A est une classe abstraite?
Qu'ai-je fait de mal?
Merci!
Réponses
Il s'agit d'un problème avec un nom indépendant - le membre auquel vous faites référence ne dépend pas du paramètre de modèle. Le compilateur ne recherche pas dans les classes de base dépendantes (comme B<T>
) lors de la recherche de noms non dépendants (comme u
).
Vous pouvez le résoudre en utilisant
this->u = this->u + qrqr;
qui spécifie au compilateur ce que u
vous voulez dire.
( coliru )
Il y a au moins deux autres façons, en appelant B<T>::u
ou en écrivant using B<T>::u;
dans la fonction avant cette ligne.
En savoir plus ici .