C++ 模板类的静态成员初始化
我想通过从一种或另一种类型派生类来启用或禁用该类的某些功能。在我为派生条件引入另一个间接层次之前,一切都很顺利 例如:C++ 模板类的静态成员初始化,c++,C++,我想通过从一种或另一种类型派生类来启用或禁用该类的某些功能。在我为派生条件引入另一个间接层次之前,一切都很顺利 例如: template<bool EnableB> struct Traits1 { static const bool BEnabled = EnableB; }; template<bool EnableB> struct Traits2 { static const bool BEnabled; }; template<bool
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
}
模板
结构Traits1
{
静态常数布尔启用=启用;
};
模板
结构Traits2
{
静态常数布尔启用;
};
模板
const bool Traits2::BEnabled=EnableB;
结构A{};
结构B:公共A{};
模板
结构C:公共标准::条件::类型
{
};
int main()
{
c1;//好的
C c2;//错误C2975:“_Test”:std::tr1::conditional”的模板参数无效,应为编译时常量表达式
}
在类内初始化我的Traits
不会有任何问题,但在类内只能初始化整型
你能解释一下为什么会出现这个问题吗?我的编译器(VS2010)有问题吗?还是这是正常行为?使用GCC4.7(在Mac OS上)似乎可以正常工作。我认为这是编译器的一个缺点。如果您能胜任,可以在Windows上尝试GCC。
bool
被认为是一种完整类型。您是否意识到在一种情况下初始化一个bool,而在另一种情况下不初始化它?错误消息还指向问题中不存在的类型。。。为什么你不发布给出错误的确切代码,或者在一个较小的例子中重现错误并使用它?@DavidRodríguez dribeas why downvote?在Traits2中,我在类外初始化了BEnabled。对于C++类型,这在C++中是合法的。在本例中,错误消息是_Test来自std::conditional。请先阅读代码并在下投票前测试它。初始化类内或类外在C++中是有效的,但第一个创建编译时常数,而另一个则不需要。初始化时的注释是for,但类内只能初始化整型。。这是正确的,但这是一个不适用于您的示例的限制。