6
コンパイルエラーに遭遇したいくつかのコードをコンパイルしながら、私には奇妙に思え、継承、ネストされたクラス、宣言とアクセス修飾子に関連するコードをコンパイルします。宣言とアクセス修飾子を使用するネストされたクラス
基本的に、派生型は、基本型のネストされた保護クラスを公開することを意図しています。
問題を実証するために、次の短い例:
class Base
{
protected:
struct Nested
{
enum value_enum
{
val = 0,
val2,
val3
};
};
};
class Derived : public Base
{
public:
using Base::Nested;
};
int main(int argc, char** argv)
{
//Base::Nested aa; // error, as (I) expected
//Base::Nested::value_enum ab; // error, as (I) expected
Derived::Nested ba; // works, as (I) expected
Derived::Nested::value_enum bb; // MSVC error, as (I) did not expect
return 0;
}
はliveを参照してください。
MSVC11(v11.00.61030)は、次のエラーで、このコードにチョーク:標準から関連部分を引用する能力なしで、私は主張よう
error C2248: 'Base::Nested' : cannot access protected struct declared in class 'Base'
GCCとクラン両方は、適切にこれをコンパイルこれはMSVCのバグです。
MSVCでこれを回避する方法はありますか? MSVCのために
私はコンパイル時にエラーを取得すると、後者の問題にして実行されているよりも優れていると思います。 –
保護されているため、標準のメイン機能ではアクセスできません。 –
@AliKazmi保護されているものは何ですか? 'Derived'は' Nested'のアクセス修飾子を変更します。この場合は保護されていません。また、 'value_enum'は' Nested'の内部では保護されていません。 – namezero