c++ - vergüenza - tag preguntas random
CRTP con miembro derivado protegido (1)
No es un problema en absoluto y se resuelve con una línea en la clase derivada:
friend class Base< Derived >;
#include <iostream>
template< typename PDerived >
class TBase
{
public:
void Foo( void )
{
static_cast< PDerived* > ( this )->Bar();
}
};
class TDerived : public TBase< TDerived >
{
friend class TBase< TDerived > ;
protected:
void Bar( void )
{
std::cout << "in Bar" << std::endl;
}
};
int main( void )
{
TDerived lD;
lD.Foo();
return ( 0 );
}
En el patrón CRTP , nos encontramos con problemas si queremos mantener la función de implementación en la clase derivada como protegida. Debemos declarar la clase base como amigo de la clase derivada o usar algo como esto (no he probado el método en el artículo vinculado). ¿Hay alguna otra forma (simple) que permita mantener la función de implementación en la clase derivada como protegida?
Edición: Aquí hay un ejemplo de código simple:
template<class D>
class C {
public:
void base_foo()
{
static_cast<D*>(this)->foo();
}
};
class D: public C<D> {
protected: //ERROR!
void foo() {
}
};
int main() {
D d;
d.base_foo();
return 0;
}
El código anterior da error: ''void D::foo()'' is protected
con g ++ 4.5.1 pero se compila si se reemplaza protected
por public
.