我有几行可以在我的系统上很好地编译,但是不能在同事系统上编译。这就是为什么我想问这个问题的解决方案是什么样的。我必须处理一个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的最可靠方法是什么。

最佳答案

您的代码对我来说似乎是正确的,并且在我的旧版本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;
};

07-25 23:25