使用模板参数初始化静态const成员

时间:2017-03-29 12:50:59

标签: c++ c++11 templates static-members static-initialization

我有几行可以在我的系统上很好地编译,但不能在同事系统上编译。这就是为什么我想问一下问题的解决方案是什么样的。我必须处理enum隐式定义我必须为std::array提供多少空间。代码的其他部分也使用FooSize是静态的。 (优化)

我目前的实现看起来像这样

enum class FooType
{
    ShortFoo,
    LongFoo
};

// defined in a different file
template <FooType FType>
class FooContainer
{
public:

    static const unsigned int FooSize {(FType == FooType::ShortFoo) ? 32 : 64 };

    std::array<float, FooSize> fooArray;

};

代码似乎在较旧的llvm / clang编译器上产生问题。 3264实际上是通过预处理器定义提供的。我可以跳过FooType并使用size作为模板参数,但我想知道初始化FooSize的最可靠方法是什么。

1 个答案:

答案 0 :(得分:1)

您的代码对我来说似乎是正确的,并且我的旧版g ++(4.9.2)和clang ++(3.5)编译没有问题。

但是,根据错误消息,可能是您的编译器没有正确支持静态数据成员的C ++ 11声明/初始化

我建议您尝试以下方式

template <FooType FType>
class FooContainer
{
public:
    static const unsigned int FooSize;

    std::array<float, FooSize> fooArray;

};

template <FooType FType>
int unsigned const FooContainer<FType>::FooSize
   = ((FType == FooType::ShortFoo) ? 32 : 64);

或(我想更好)

template <FooType FType>
class FooContainer
{
public:

    static const unsigned int FooSize {(FType == FooType::ShortFoo) ? 32 : 64 };

    std::array<float, FooSize> fooArray;

};

template <FooType FType>
int unsigned const FooContainer<FType>::FooSize;

您也可以尝试将FooSize定义为constexpr而不是const

另一种解决方案可能是在模板参数

中转换FooSize
template <FooType FType,
   std::size_t FooSize = (FType == FooType::ShortFoo) ? 32 : 64 >
class FooContainer
{
public:
    std::array<float, FooSize> fooArray;
};