2015-07-08 13 views
17
#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; 
} 

Dieses Programm kompiliert und läuft normal. Die statische Variable s ist privat in der Basisklasse, die privat vererbt wird. Wie greift die Derived-Klasse darauf zu?Private statische Mitglied in der Basisklasse

Wenn die abgeleitete Klasse keine Vorlage ist, beschwert sich der Compiler über den Zugriff auf private Variable.

[[email protected] 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. 
+0

Welcher Compiler? gcc, klingeln? –

+0

Beim Lesen dieser Frage könnte jemand erklären, warum der Compiler die Zeile 'std :: string Base :: s = "some_text" nicht für möglich hält. ist globaler Zugang, also für eine private Variable verboten? Es ist schon einige Zeit her, dass ich C++ benutzt habe. –

+1

Das ist eine Definition, keine Deklaration. Es initialisiert nur die Zeichenfolge, die zuvor in Base deklariert wurde. Da es innerhalb von Base deklariert wurde, handelt es sich um eine statische Klassenvariable, die privat ist, da dies die Standardzugriffsebene für die Klasse ist. –

Antwort

17

ausfällt, äquivalent zu GCC Bug 58740:

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

Der Fehler ist noch offen, und dieser Code kompiliert immer noch auf 5.1. GCC hat Probleme mit dem Vorlagenzugriff, dies ist nur ein weiteres Beispiel.

5

Ich denke, das ist ein Compiler-Bug, wie dies mit gcc aber nicht kling, für mich kompiliert.

Edit: als zusätzlichen Datenpunkt scheint dieser Fehler nicht behoben worden zu sein, da ich in gcc 4.9.2 und 5.1 reproduzieren kann.

3

Es ist ein Fehler in g ++ 4.8.4. Der Code wird kompiliert, nur wenn Derived eine Vorlage ist und das Mitglied statisch ist.

Tests: Dies ist definitiv ein GCC Fehler

  • statische Vorlage kompiliert
  • keine Vorlage statische
  • Vorlage nicht statisch nicht versagt
  • keine Vorlage nicht statisch
Verwandte Themen