programacion polimorfismo modificadores hijo herencia derivada clase acceso c++ templates inheritance g++ static-members

c++ - polimorfismo - modificadores de acceso java



Miembro estático privado en la clase base (3)

Creo que esto es un error del compilador, ya que compila con gcc pero no con clang, para mí.

Editar: como un punto de datos adicional, este error no parece haberse solucionado, ya que puedo reproducirlo en gcc 4.9.2 y 5.1.

#include <iostream> #include <string> class Base { static std::string s; }; template<typename T> class Derived : Base { public: Derived() { std::cout << s << std::endl; } }; std::string Base::s = "some_text"; int main() { Derived<int> obj; }

Este programa se compila y se ejecuta normalmente. la variable estática s es privada en la clase base que se hereda de forma privada. ¿Cómo está accediendo la clase Derived?

Si la clase Derivada no es una plantilla, el compilador se queja sobre el acceso a la variable privada.

[aminasya@amy-aminasya-lnx c++]$ g++ --version g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3) Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Es un error en g ++ 4.8.4. El código compila, solo si Derived es una plantilla y el miembro es estático.

Pruebas:

  • compilaciones estáticas de plantilla
  • ninguna plantilla estática falla
  • la plantilla no estática falla
  • ninguna plantilla no estática falla

Esto es definitivamente un error de GCC, equivalente a GCC Bug 58740 :

class A { static int p; }; int A::p = 0; template<int=0> struct B : A { B() {(void)p;} }; int main() { B<>(); }

El error aún está abierto, y este código aún se compila en 5.1. GCC tiene problemas con el acceso de los miembros de la plantilla, este es solo otro ejemplo más.