在 Visual Studio 中使用枚举时出现编译错误

问题描述 投票:0回答:2

我在课堂上定义了这个

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
值不能与父类中定义的函数同名?

c++ visual-studio enums visual-studio-2019
2个回答
3
投票

我不明白为什么我理解的具有作用域的

enum
值不能与父类中定义的函数同名?

这不是真的。

enum
与同名成员会发生冲突。

您应该使用的是范围枚举,例如:

enum class MenuNavigation : int {
    FileMenu,
    AutoAssign,
    EditMenu,
    ViewMenu,
    OptionsMenu,
    HelpMenu
};

然后

MenuNavigation::AutoAssign

您应该对

CCreateReportDlg
做同样的事情,然后
CCreateReportDlg::AutoAssign
MenuNavigation::AutoAssign
就永远不会发生冲突。


1
投票

我不明白为什么我理解的枚举值不能具有作用域 与父类中定义的函数同名吗?

您定义的枚举器是无范围的,因此其成员的范围将是周围模块或命名空间的范围。

要定义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

© www.soinside.com 2019 - 2024. All rights reserved.