2012-09-22 11 views
15

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 

} 

Respuesta

30
template <typename F> class S : C<A, F> 
          ^

No se especifica una herencia public, por lo que el valor predeterminado es private, por lo que las clases base inaccesible.

+0

No importa el último comentario. Está funcionando ahora que reemplacé * todas * las clases con herencia pública. –

+0

Otra idea sería hacer que todas sean estructuras para que podamos tener herencia pública predeterminada. :) – 0x499602D2

5

Creo que es simplemente una cuestión de usar public herencia de clases. Pruebe con:

template <template<class> class E, typename D> class C : public E<D> { 
    public: 
     int f() { 
     return E<D>::f(); 
     } 
}; 

template <typename F> class S : public C<A, F> { 
    public: 
     int f() { 
     return A<F>::f(); 
     } 
}; 
3

Cuando intenta llamar a la versión de A , usa la notación A<F>::f(). Si A<F> tenía una función de miembro staticf(), esta función se llamaría. Sin embargo, A<F> solo tiene una función de miembro staticf(), es decir, la llamada se traduce implícitamente a this->A<F>::f(). Sin embargo, S<F> no tiene A<F> como base accesible (es una base private de C<A, F>). Desde el aspecto de que desea delegar a la versión de f()C<A, F> s:

C<A, F>::f(); 

que deberían funcionar debido a C<A, F> es una base accesible de S<int> o hacer que la E<D> base del C accesible por lo que es ya sea public o protected.

+0

No estoy seguro de que esto sea cierto. En este caso, 'A ' es una base privada del tipo. La búsqueda encontrará el nombre del tipo inyectado antes de que llegue a verificar el nivel del espacio de nombres, por lo tanto, si el método miembro en 'A 'es estático o no, realmente no importa. –

Cuestiones relacionadas