2015-12-23 13 views
6

Dieser Code wird verwendet mit Visual Studio 2015 funktionieren, aber es nicht mehr funktioniert mit Visual Studio 2015 Update 1.Freund Klasse kann nicht geschütztes Mitglied zugreifen

class Foo 
{ 
protected: 

    virtual ~Foo() {}; 
    friend class Foo__init; 
}; 

class Foo__init 
{ 
public: 

    Foo _init; 
}; 

static Foo__init _Foo_init; 

Es wird mit folgendem Fehler fehl:

Error C2248 'Foo::~Foo': cannot access protected member declared in class 'Foo' 

Ist dies ein Compiler-Bug oder ist der Code fehlerhaft?

+0

Vielleicht möchten Sie den Destruktor von Foo veröffentlichen. –

+2

Ich frage nicht danach. :) –

+2

Was passiert, wenn Sie 'class Foot__init;' vor der Definition von 'Foo' setzen? – Holt

Antwort

3

Von here:

The friend declaration appears in a class body and grants a function or another class access to private and protected members of the class where the friend declaration appears.

So ist es ein Compiler-Fehler. Sowohl g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010 als auch Ubuntu clang version 3.6.2-1 (tags/RELEASE_362/final) (based on LLVM 3.6.2) kompilieren diesen Code (ich fügte int main() {} hinzu).

+1

Es ist in der Tat ein Fehler, aber das kann nicht damit begründet werden, dass die anderen Hauptanbieter es kompilieren, während VC++ nicht;) – 101010

+0

Was können wir dann akzeptieren? als Beweis dafür? C++ Standard? –

+2

Genau ........ – 101010

2

Es ist ein Compiler-Fehler. Es funktioniert in VS2008

+1

Ziemlich sicher ist ein Compiler-Fehler, aber Destruktor ist erforderlich, um das Foo-Mitglied zu zerstören, dies sollte nur funktionieren, weil die Freund-Klasse. –

+0

Ja, im aktuellen Szenario haben wir kein Foo-Objekt. es ist seltsam, warum versucht wird, darauf zuzugreifen. – user1512

Verwandte Themen