Estoy intentando llamar a la función de clase A<F>::f()
desde dentro de la clase S
, pero yo estoy poniendo los siguientes errores cuando una instancia de un objeto S
(S<int>s
) y llamarlo es f
función miembro():¿Por qué recibo el error 'A <int>' no es una base accesible de 'S <int>' para la clase base de una clase base?
source.cpp: In instantiation of '
int S<F>::f() [with F = int]
':
source.cpp:30:21: required from here
source.cpp:22:25: error: 'A<int>
' is not an accessible base of 'S<int>
'
Tenga en cuenta que esto funciona cuando reemplazo return A<F>::f();
dentro de la declaración de la clase S
con return C<A, F>::f();
. Pero me pregunto por qué no puedo hacerlo de la otra manera ...
#include <iostream>
template <typename T> class A {
public:
int f();
};
template <typename T> int A<T>::f() {
return sizeof(T);
}
template <template <typename> class E, typename D> class C : E<D> {
public:
int f() {
return E<D>::f();
}
};
template <typename F> class S : C<A, F> {
public:
int f() {
return A<F>::f();
}
};
int main() {
S<int>s;
std::cout << s.f();
}
cualquier ayuda se agradece y si necesita más aclaraciones no dude en comentar.
actualización
Desde esta pregunta se resuelve Creo que debería enviar el código que funcionaba:
#include <iostream>
template <typename T> class A {
public:
int f();
};
template <typename T> int A<T>::f() {
return sizeof(T);
}
template <template <typename> class E, typename D> class C : public E<D> {
public:
int f() {
return E<D>::f();
}
};
class S : public C<A, int> {};
int main() {
S s;
std::cout << s.f(); // 4
}
No importa el último comentario. Está funcionando ahora que reemplacé * todas * las clases con herencia pública. –
Otra idea sería hacer que todas sean estructuras para que podamos tener herencia pública predeterminada. :) – 0x499602D2