J'essaie d'implémenter une hiérarchie de classes CRTP. Je suis intéressé par la classe de base pour avoir accès à l'élément de données d'une classe dérivée de la chaîne:Pourquoi la hiérarchie CRTP suivante ne compile-t-elle pas?
#include <iostream>
template <class Derived>
class A {
public:
void showv() {
std::cout << static_cast<const Derived*>(this)->v << std::endl;
}
};
template <class Derived>
class B : public A<Derived> {
typedef A<Derived> base;
friend base;
};
class fromA : public A<fromA> {
typedef A<fromA> base;
friend base;
protected:
int v = 1;
};
class fromB : public B<fromB>
{
typedef B<fromB> base;
friend base;
protected:
int v = 2;
};
int main()
{
// This runs ok
fromA derived_from_a;
derived_from_a.showv();
// Why doesn't the following compile and complains about the protected member?
fromB derived_from_b;
derived_from_b.showv();
return 0;
}
Bien que la première classe dérivée (fromA
) compile et fonctionne comme prévu, le deuxième (fromB
), qui dérive d'une classe dérivée de A
, ne le fait pas.
- Quelle est la raison pour laquelle les déclarations d'amis ne sont pas acheminées?
- Des suggestions sur une solution de contournement?
pourquoi ne pas créer de fonction virtuelle getV() et le remplacer dans chaque classe dérivée au lieu des jeux avec des amis? –
'ami' de mon' ami' n'est pas mon ami en C++. – Jarod42