Das folgende scheint ein Muster zu sein, das von ZeroC ICE in dem Code verwendet wird, den es automatisch erzeugt, der für einige Releases ihres Tools jetzt ein Weg zu sein scheint, Singletons zu machen (nicht sicher warum). Verschiedene Compiler haben kein Problem damit, bis ich heute festgestellt habe, dass Visual Studio 2015 Update 1 (VS Version 14.0.24720.00, VC++ Version 19.00.23506) einen Fehler ausgibt. Vor Update 1 hatte VS2015 auch kein Problem damit. Ich bin nicht sicher, ob es ein Fehler (Regression?) In der VS2015 C++ - Compiler mit Update 1 oder schlechter (nicht standardkonformer) C++ - Code ist, die andere Compiler gleiten lassen.VS2015 Update 1 Bug oder schlechtes C++: Warum kann eine Freundesklasse nicht auf den geschützten Destruktor eines Freundes zugreifen?
Hier ist ein Beispiel des Codemusters ist:
class Foo {
protected:
virtual ~Foo() {}
friend class Foo_init;
};
class Foo_init {
public:
Foo init;
};
static Foo_init staticFooInit;
VS2015 Update 1 sendet diese Fehler:
example.cpp(13): error C2248: 'Foo::~Foo': cannot access protected member declared in class 'Foo'
example.cpp(3): note: see declaration of 'Foo::~Foo'
example.cpp(1): note: see declaration of 'Foo'
ich eine (noch offen) gefunden ZeroC ICE forum post, die im Zusammenhang mit dieser zu sein scheint, aber Ansonsten habe ich in meiner Google-Suche nichts gefunden, was mich davon überzeugt, dass es sich um ein Compiler-Problem oder einen schlechten Code handelt. Ich gebe zu, ich kenne ZeroC ICE nicht sehr gut, und ich benutze auch keine C++ - Freundesklassen, um ein tiefes Verständnis davon zu haben, was man mit ihnen machen kann und was nicht. Ich hoffe, dass jemand, der besser Bescheid weiß, etwas Licht ins Dunkel bringen kann.
Offensichtliche [Compiler] Bug ist offensichtlich. –
Falls das tatsächlich ein Compiler Bug ist, habe ich hier einen Fehlerbericht an Microsoft geschickt: https://connect.microsoft.com/VisualStudio/feedback/details/2148128 –
Ehrlich gesagt fühlt es sich immer noch falsch an, einen geschützten Destruktor auf einem zu rufen Freund, auch wenn es legal ist. –