次のようなコードがあります。クラステンプレートには、初期化が必要な静的変数があります。私は、テンプレート引数としてプライベート、内部クラスを使用するテンプレートクラスのtypedefを持っている:アクセスできないテンプレートクラスの静的メンバーをどのように初期化しますか?
template <typename T>
class Foo
{
private:
static const char* s_name;
};
class Bar
{
private:
class Baz
{
// ...
};
typedef Foo<Baz> FooBaz;
};
を私はこのような静的変数を初期化すると考えていた:
template<>
const char* Foo<Bar::Baz>::s_name = "foobaz";
そして、それは動作します...私が打ち鳴らすとビルド時にMSのVisual Studio 2015年にしかし、私は次のようなエラーが表示されます。
Error 'Baz' is a protected member of 'Bar'
なぜこのMSVSと仕事ではなくが打ち鳴らすのですか?両方で動作するこの変数を初期化する方法はありますか?
シンプルで、 'バー'の内部に 'Baz'を' public'という名前にします。 – WhiZTiM
GCCも文句を言います。私はMSVCが間違っていて、このコードはコンパイルすべきではないと確信しています。 –
MSVCはここでバグです。クラスの* any *名前を使用することは、メンバーアクセス*チェックを通過することになっています。 – WhiZTiM