2017-06-20 66 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"; 
相关问题