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

Initialize a static const member with a template argument

我有几行在我的系统上编译得很好,但在同事的系统上编译不好。这就是为什么我想问问这个问题的首选解决方案是什么样的。我必须处理一个 enum,它隐含地定义了我必须为 std::array 提供多少 space。代码的其他部分也使用静态的 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 并将大小用作模板参数,但我想知道初始化 FooSize 最可靠的方法是什么。

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

但是,根据错误信息,可能是您的编译器没有正确支持静态数据成员的 C++11 declaration/initialization

建议您按照以下方式尝试

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;
};