2015-12-23 10 views
6

Visual Studio 2015 ile iyi çalışmak için kullanılan bu kod, ama değildi artık Visual Studio 2015 güncellemesi ile çalışır 1. Aşağıdaki hata ile başarısızarkadaş sınıfı korumalı üyeye erişemez

class Foo 
{ 
protected: 

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

class Foo__init 
{ 
public: 

    Foo _init; 
}; 

static Foo__init _Foo_init; 

:

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

Bu bir derleyici hatası mıdır, yoksa kod bozuk mu? here itibaren

+0

Mayhbe'de çalışmaktadır ve Foo kamuoyunun yıkıcısını yapmak istersiniz. –

+2

Bunu sormuyorum. :) –

+2

"Foo" tanımından önce "Foot__init" sınıfını koyarsanız ne olur? – Holt

cevap

3

:

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.

Bu yüzden bir derleyici böcek. Hem g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010 hem de Ubuntu clang version 3.6.2-1 (tags/RELEASE_362/final) (based on LLVM 3.6.2) bu kodu derler (int main() {} ekledim).

+1

Bu gerçekten bir hatadır, ancak bu, diğer ana satıcıların VC++ içermediği halde derlemesiyle haklı çıkarılamaz;) – 101010

+0

Öyleyse neleri kabul edebiliriz? kanıt olarak? C++ standardı? –

+2

Tam olarak ........ – 101010

2

Bu bir derleyici hatasıdır. VS2008

+1

Oldukça emin bir derleyici hata, ancak yıkıcı Foo üyesi yok etmek için gereklidir, bu sadece arkadaş sınıf çünkü çalışması gerekir. –

+0

Evet, Mevcut senaryoda, hiçbir Foo nesnesiz yok. Buna erişmeye çalışmak garip. – user1512