2015-12-23 10 views
6

のVisual Studio 2015で正常に動作するために使用されるこのコードが、それは長くないのVisual Studio 2015のアップデートで動作します。1.それは次のエラーで失敗しフレンドクラスは、保護部材にアクセスすることはできません

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' 

これはコンパイラのバグですか?コードが不正ですか? hereから

+0

あなたはFooのデストラクタをpublicにしたいと思うかもしれません。 –

+2

私はそれについて尋ねていません。 :) –

+2

'Foo'の定義の前に' class Foot__init; 'を置くとどうなりますか? – Holt

答えて

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.

だから、それはコンパイラのバグです。 g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010Ubuntu clang version 3.6.2-1 (tags/RELEASE_362/final) (based on LLVM 3.6.2)の両方がこのコードをコンパイルします(私はint main() {}を追加しました)。

+1

これは実際にはバグですが、これは他の主要ベンダーがVC++がコンパイルしていない間にコンパイルすると述べることによって正当化できません;) – 101010

+0

証明として? C++標準? –

+2

正確に........ – 101010

2

これはコンパイラのバグです。これはVS2008で動作します

+1

コンパイラのバグは間違いありませんが、デストラクタはFooメンバを破壊する必要があります。これはフレンドクラスのためにのみ有効です。 –

+0

はい、現在のシナリオではFooオブジェクトはありません。それがなぜそれにアクセスしようとしているのか不思議です。 – user1512

関連する問題