我有几行可以在我的系统上很好地编译,但是不能在同事系统上编译。这就是为什么我想问这个问题的解决方案是什么样的。我必须处理一个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
的最可靠方法是什么。 最佳答案
您的代码对我来说似乎是正确的,并且在我的旧版本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;
};