我在课堂上定义了这个
enum
:
enum MenuNavigation : int {
FileMenu,
AutoAssign,
EditMenu,
ViewMenu,
OptionsMenu,
HelpMenu
};
当我编译它时,我收到一个编译错误:
5>D:\My Programs\2019\MeetSchedAssist\Meeting Schedule Assistant\CreateReportDlg.h(360,7): error C2365: 'CCreateReportDlg::AutoAssign': redefinition; previous definition was 'enumerator' 5>D:\My Programs\2019\MeetSchedAssist\Meeting Schedule Assistant\CreateReportDlg.h(190): message : see declaration of 'CCreateReportDlg::AutoAssign'
在第 360 行我有一个函数声明:
BOOL AutoAssign(UINT uNumToFill,
UINT uStartIndex,
CStringArray &rAryStrAllBrothers, ROW_DATA_S &rsRowData, int iGridColumn);
如果我将枚举项重命名为
AutoAssignments
或 kAutoAssign
它会编译。
我不明白为什么我理解的具有作用域的
enum
值不能与父类中定义的函数同名?
我不明白为什么我理解的具有作用域的
值不能与父类中定义的函数同名?enum
这不是真的。
enum
与同名成员会发生冲突。
您应该使用的是范围枚举,例如:
enum class MenuNavigation : int {
FileMenu,
AutoAssign,
EditMenu,
ViewMenu,
OptionsMenu,
HelpMenu
};
然后
MenuNavigation::AutoAssign
。
您应该对
CCreateReportDlg
做同样的事情,然后 CCreateReportDlg::AutoAssign
和 MenuNavigation::AutoAssign
就永远不会发生冲突。
我不明白为什么我理解的枚举值不能具有作用域 与父类中定义的函数同名吗?
您定义的枚举器是无范围的,因此其成员的范围将是周围模块或命名空间的范围。
要定义scoped枚举器,请将
class
添加到声明中;那么它的成员仅在带有类前缀时可见:
enum class MenuNavigation : int {
FileMenu,
AutoAssign, // We can now use this name without a clash in the function...
EditMenu, // ... use MenuNavigation::AutoAssign to refer to the value!
ViewMenu,
OptionsMenu,
HelpMenu
};
BOOL AutoAssign(UINT uNumToFill,
UINT uStartIndex,
CStringArray& rAryStrAllBrothers, ROW_DATA_S& rsRowData, int iGridColumn);
进一步阅读cppreference。