我有几行可以在我的系统上很好地编译,但不能在同事系统上编译。这就是为什么我想问一下问题的解决方案是什么样的。我必须处理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编译器上产生问题。 32
和64
实际上是通过预处理器定义提供的。我可以跳过FooType
并使用size作为模板参数,但我想知道初始化FooSize
的最可靠方法是什么。
答案 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;
};