Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 强类型枚举不允许用作相同基础类型的参数?_C++_C++11_Enums_Strongly Typed Enum - Fatal编程技术网

C++ 强类型枚举不允许用作相同基础类型的参数?

C++ 强类型枚举不允许用作相同基础类型的参数?,c++,c++11,enums,strongly-typed-enum,C++,C++11,Enums,Strongly Typed Enum,考虑以下代码。我假设通过指定强类型枚举的类型,我将能够使用它传递给相同类型的函数和模板,因为指定的底层类型是相同的;尽管编译器抱怨类型转换丢失。在下面的代码中,删除关键字class和Test::TOTAL_ITEMS的枚举上的说明符回到TOTAL_ITEMS将起作用。我知道他们不希望强类型枚举进行任何类型转换,但当底层类型与函数或模板预期接收的类型相同时,我希望编译器不会对此抱怨,也不会强制执行特定强制转换。想法 #include <iostream> #include <cs

考虑以下代码。我假设通过指定强类型枚举的类型,我将能够使用它传递给相同类型的函数和模板,因为指定的底层类型是相同的;尽管编译器抱怨类型转换丢失。在下面的代码中,删除关键字
class
Test::TOTAL_ITEMS
的枚举上的说明符回到
TOTAL_ITEMS
将起作用。我知道他们不希望强类型枚举进行任何类型转换,但当底层类型与函数或模板预期接收的类型相同时,我希望编译器不会对此抱怨,也不会强制执行特定强制转换。想法

#include <iostream>
#include <cstdint>

template <typename T, std::size_t N = 10>
class Y {
public:
   Y() : z_() {
   }
   ~Y() = default;

private:
   T z_[N];
};

class X {
public:
   enum class Test : std::size_t {
      ITEM1 = 0,
      ITEM2,
      TOTAL_ITEMS,
   };

private:
   Y<int, Test::TOTAL_ITEMS> collection;
};

int main() {
   X xx;
}
#包括
#包括
模板
Y类{
公众:
Y():z_40;){
}
~Y()=默认值;
私人:
T z_[N];
};
X类{
公众:
枚举类测试:std::size\u t{
第1项=0,
项目2,
项目总数,
};
私人:
Y收集;
};
int main(){
X xx;
}

枚举类的目的是防止其实例隐式转换为其他类型。这就是为什么删除
class
会编译:常规
enum
实例隐式转换为其基础类型可以转换的任何对象

如果要将
枚举类
转换为其他类型,必须明确执行以下操作:

enum类Foo:int{FEE,FYE,FOE,FUM};
void f(Foo x){};
void g(int x){};
int main()
{
f(Foo::FEE);//好的:正确的类型
//f(0);//错误:没有隐式转换
f(static_cast(0));//好的:显式转换
//g(Foo::FYE);//错误:没有隐式转换
g(1);//好的:正确的类型
g(static_cast(Foo::FYE));//好的:显式转换
}

。有关何时以编程方式提取类型的信息,请参阅。

作用域枚举的全部目的是防止隐式转换为基础类型。您需要强制转换它,以使代码得以编译

#include <type_traits>
Y<int, static_cast<std::underlying_type<Test>::type>(Test::TOTAL_ITEMS)> collection;

是的,这就是我最后要做的。谢谢你的解释
#include <type_traits>
Y<int, static_cast<std::underlying_type<Test>::type>(Test::TOTAL_ITEMS)> collection;
enum Test : std::size_t {
// ...
};