Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类的静态成员初始化_C++ - Fatal编程技术网

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,但类内只能初始化整型。。这是正确的,但这是一个不适用于您的示例的限制。