使用模板参数初始化静态常量成员
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 编译器上产生问题。 32
和 64
实际上是通过预处理器定义提供的。我可以跳过 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;
};
我有几行在我的系统上编译得很好,但在同事的系统上编译不好。这就是为什么我想问问这个问题的首选解决方案是什么样的。我必须处理一个 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 编译器上产生问题。 32
和 64
实际上是通过预处理器定义提供的。我可以跳过 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;
};