我的代码:
Enumerations.h
#ifndef ENUMERATIONS_H
#define ENUMERATIONS_H
enum class Employees
{
ERIC,
RYAN,
EMILY
};
#endif
Structs.h
struct Employee
{
std::string name;
double wage;
};
Review.cpp
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Enumerations.h"
#include "Structs.h"
Employee employeeArray[3];
employeeArray[0] = { "Eric Sartor", 18.75 };
employeeArray[1] = { "Ryan Ulch", 20.36 };
employeeArray[2] = { "Emily Gover", 18.75 };
cout << employeeArray[Employees::RYAN].name;
所以我试图做一些我在我的c++教程中读到的东西,在那里你通过枚举值调用数组元素(结构体)。在本教程的前面,建议如果您的编译器兼容c++ 11(我的编译器是兼容的),那么最好使用枚举类而不是常规枚举。
我注意到,当试图通过Employees::RYAN
枚举值从我的数组调用我的元素时,它给了我一个错误,说"表达式必须具有整数或无范围枚举类型"。如果我从枚举中删除class关键字,那么它只是enum Employees
,我将数组索引更改为RYAN
,它工作得很好。是我遗漏了什么,还是这对枚举类不起作用?
希望我说得够清楚了。在教程的例子中,他实际上并没有使用枚举类,只是一个常规的枚举,尽管他之前明确地说过,如果可以的话,总是这样做……希望有人能为我澄清这一点!
具有enum-key为class
或struct
的枚举是范围的枚举。有作用域的枚举没有到int
的隐式转换。
通过整型提升(4.5)将枚举数或无作用域枚举类型的对象的值转换为整数。(例子:
enum color { red, yellow, green=20, blue }; color col = red; color* cp = &col; if (*cp == blue) // ...
使color成为描述各种颜色的类型,然后声明
col
为该类型的对象,cp
为指向该类型对象的指针。类型为color
的对象可能取值为:red
,yellow
,green
,blue
;这些值可以转换为整数值0
、1
、20
、21
。由于枚举是不同的类型,color
类型的对象只能被分配color
类型的值。color c = 1; // error: type mismatch, // no conversion from int to color int i = yellow; // OK: yellow converted to integral value 1 // integral promotion
注意,这种隐式的
enum
到int
的转换不提供给作用域枚举:enum class Col { red, yellow, green }; int x = Col::red; // error: no Col to int conversion Col y = Col::red; if (y) { } // error: no Col to bool conversion
可以显式地将枚举数强制转换为int
:
cout << employeeArray[static_cast<int>(Employees::RYAN)].name;
选自c++标准(5.2.1下标)
1后接方括号中的表达式为后缀表达式。其中一种表述形式为"T的数组"或"指向T的指针"以及其他类型的都没有作用域枚举或整型....
没有从作用域枚举到整型的隐式转换。
如果你想使用作用域枚举作为索引,你必须显式地将其转换为某种整型。例如
cout << employeeArray[static_cast<int>( Employees::RYAN )].name;