Ошибка компиляции с использованием enum в Visual Studio - PullRequest
1 голос
/ 19 апреля 2020

Я определил это 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'

On line 360 У меня есть объявление функции:

BOOL AutoAssign(UINT uNumToFill, 
                UINT uStartIndex, 
                CStringArray &rAryStrAllBrothers, ROW_DATA_S &rsRowData, int iGridColumn);

Если я переименую свой элемент перечисления в AutoAssignments или kAutoAssign, он скомпилируется.

Я не понимаю, почему значение enum, которое Я понял, что область действия не может иметь то же имя, что и функция, определенная в родительском классе?

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

Я не понимаю, почему значение enum, которое, как я понял, имеет область действия, не может иметь то же имя, что и функция, определенная в родительском классе?

Это не так правда. enum s с членами с одинаковыми именами будет cla sh.

. Вместо этого вы должны использовать перечисления с областью действия , например:

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

, а затем MenuNavigation::AutoAssign.

Вы должны сделать то же самое для CCreateReportDlg, и тогда CCreateReportDlg::AutoAssign и MenuNavigation::AutoAssign никогда не станут sh.

1 голос
/ 19 апреля 2020

Я не понимаю, почему значение перечисления, которое, как я понял, имеет область действия, не может иметь то же имя, что и функция, определенная в родительском классе?

Перечислитель, который у вас есть определен unscoped , так что область его членов будет охватывать окружающий модуль или пространство имен.

Чтобы определить перечислитель 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...