【问题标题】:How to specify an array size in a template function parameter from an enum class value?如何从枚举类值中指定模板函数参数中的数组大小?
【发布时间】:2018-06-26 14:18:55
【问题描述】:

根据我的理解,下面的代码不应该编译,因为枚举类必须显式转换为整数类型:

enum class MyEnum : int {
    enumValue = 0,
    ... ,
    COUNT
};

template<typename EnumType>
class MyClass {
    void Bar(int someParameters[EnumType::COUNT]) { ... }
};

MyClass<MyEnum> myObject; // compilation error at template instanciation when using an enum class

但是使用这样一个我原以为是 constexpr 的演员,使用 Visual Studio 2015 会产生一个奇怪的编译错误 (编辑:它适用于 g++,所以它很可能是 VS 编译器的问题,而不是任何问题否则)

template<typename EnumType>
class MyClass {
    void Bar(int someParameters[static_cast<int>(EnumType::COUNT)]);
};

template<typename EnumType>
void MyClass<EnumType>::Bar(int someParameters[static_cast<int>(EnumType::COUNT)]) { ... }

unable to match function definition 'MyClass&lt;EnumType&gt;(int [])' to existing declaration 'MyClass&lt;EnumType&gt;(int ['function'])'


如何在不将枚举类转换为标准枚举的情况下解决这个编译问题?

【问题讨论】:

  • void Bar(int someParameters[some_constant]) 等价于 void Bar(int someParameters[])void Bar(int* someParameters) 无论如何。只需放下数组绑定并完成它。
  • 数组大小在那里毫无意义,删除它。
  • @IgorTandetnik 只需将您的评论作为答案,我会验证它:)
  • @AndyG 是的,谢谢我编辑了问题

标签: c++ arrays enums static signature


【解决方案1】:

你可能会使用:

template<typename EnumType>
class MyClass
{
public:
    void Bar(int (&someParameters)[static_cast<int>(EnumType::COUNT)]);
};

template<typename EnumType>
void MyClass<EnumType>::Bar(int (&someParameters)[static_cast<int>(EnumType::COUNT)])
{}

Demo

或者限制更少,只使用指针:

template<typename EnumType>
class MyClass
{
public:
    void Bar(int someParameters[]);
};

template<typename EnumType>
void MyClass<EnumType>::Bar(int someParameters[])
{}

【讨论】:

  • 此代码在 Visual Studio 2015 中产生错误。
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多