2017-06-20 102 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'公共名稱裏面'酒吧' – WhiZTiM

+1

GCC也抱怨。我很確定MSVC是錯誤的,這個代碼不應該編譯。 –

+1

MSVC在這裏是越野車。使用*任何*類名稱應該通過*成員訪問*支票 – WhiZTiM

回答

0

在「Bar」中公開「typedef Foo FooBaz」並使用「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"; 
相關問題