2017-06-20 8 views
1

次のようなコードがあります。クラステンプレートには、初期化が必要な静的変数があります。私は、テンプレート引数としてプライベート、内部クラスを使用するテンプレートクラスの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と仕事ではなくが打ち鳴らすのですか?両方で動作するこの変数を初期化する方法はありますか?

+0

シンプルで、 'バー'の内部に 'Baz'を' public'という名前にします。 – WhiZTiM

+1

GCCも文句を言います。私はMSVCが間違っていて、このコードはコンパイルすべきではないと確信しています。 –

+1

MSVCはここでバグです。クラスの* any *名前を使用することは、メンバーアクセス*チェックを通過することになっています。 – WhiZTiM

答えて

0

"typedef Foo FooBaz"を "Bar"に公開し、 "Bar :: FooBaz :: s_name"を使用します。

+0

これはBarの内部でのみ使用され、パブリックインターフェイスの一部であってはなりません。 – Srayer

0

部分的なインスタンス化を気にしない場合は、いつでも使用できます。

template<typename T> 
    const char * Foo<T>::s_name = "foo"; 

あなたはFooをBarに友人にする必要があります。

class Bar 
{ 
private: 
    class Baz { 
     // ... 
    }; 
    friend class Foo<Baz>; 

    typedef Foo<Baz> FooBaz; 

}; 
template<> 
    const char * Foo<Bar::Baz>::s_name = "barbaz"; 
関連する問題