2013-04-29 59 views
2

我想要通过从一个类或另一个类派生类来启用或禁用某些类的某些功能。一切工作正常,直到我介绍另一个层次的间接导出条件。模板类的静态成员初始化

例子:

template<bool EnableB> 
struct Traits1 
{ 
    static const bool BEnabled = EnableB; 
}; 

template<bool EnableB> 
struct Traits2 
{ 
    static const bool BEnabled; 
}; 

template<bool EnableB> 
const bool Traits2<EnableB>::BEnabled = EnableB; 

struct A{}; 
struct B : public A{}; 

template<typename Traits> 
struct C : public std::conditional<Traits::BEnabled, B, A>::type 
{ 
}; 


int main() 
{ 
    C<Traits1<true>> c1; //OK 
    C<Traits2<true>> c2; //error C2975: '_Test' : invalid template argument for 'std::tr1::conditional', expected compile-time constant expression 
} 

我不会有任何问题,我的初始化里面Traits类,但只有整数类型可以内部类进行初始化...

能否请您解释一下为什么这个问题似乎?是我的编译器(VS2010)的问题,或者这是正常的行为?

+0

'bool'被认为是一个整体类型。你意识到你正在初始化一个bool而不是在另一个初始化它?错误信息也指向一个不在问题中的类型......为什么不发布给你错误的确切代码,或者**在一个更小的例子中重现**它并使用它? – 2013-04-29 12:45:57

+0

@DavidRodríguez-dribeas为什么选择downvote?在Traits2中,我在课堂外初始化BEnabled。这在C++中对于整型是合法的。此外,错误消息是为这个例子,_Test是从std ::条件。请阅读代码并在downvote之前对其进行测试... – Felics 2013-04-29 12:54:26

+0

在C++中初始化类的内部或外部是有效的,但第一个创建编译时间常量,另一个不需要。初始化的注释是用于*,但只有整型可以在类内初始化。*这是真实的,但是是一个限制,不适用于您的示例。 – 2013-04-29 13:10:28

回答

0

它似乎使用GCC 4.7(在Mac OS上)正常工作。我将要解决它是一个编译器的缺点。如果你愿意,也许可以在Windows上试用GCC。

相关问题