Странная ошибка при попытке объявить перечисление в C++ Visual Studio 2010

У меня странная проблема с компиляцией и старым проектом C++ Visual Studio 5 в Visual Studio 2010. Существует непреодолимая ошибка компилятора, от которой я не могу избавиться, которая, по-видимому, связана с перечислением «DBTYPE». Фрагмент файла .h приведен ниже с несколькими дополнительными строками на случай, если ошибка исходит сверху:

struct CBrowseField;
class CODBCBrowseDlg;

typedef CArray <CBrowseField*, CBrowseField*&> FLDNAMES;
typedef CArray <CString, LPCTSTR > COLNAMES;

enum DBTYPE
{                 //this bracket is where all 7 errors point to.
   DB_FOXPRO26,
   DB_OTHERS
};

Я получаю 7 ошибок при компиляции, все говорят одно и то же и все указывают на один и тот же номер строки. Ошибка заключается в следующем:

Ошибка 71 ошибка C2371: «DBTYPE»: переопределение; разные базовые типы d:\temp\npc\print manager - 1\core\blib\odbcbrowsegrid.h 29 1 npcnt

Так что, черт возьми, здесь происходит. Я проверил и перепроверил синтаксис. Это выглядит хорошо для меня. Я просмотрел весь каталог, чтобы увидеть, есть ли другой экземпляр DBTYPE, а его нет. Что мне не хватает? Если его действительно переопределяют, почему, черт возьми, он не говорит мне, где другие определения?


person Ultratrunks    schedule 24.08.2011    source источник
comment
Вы по-прежнему получаете сообщение об ошибке, если измените DBTYPE на что-то другое? (например, DB_TYPE)   -  person Ferruccio    schedule 25.08.2011
comment
Ошибка исчезает, когда я меняю имя. Я не особо привязан к имени DBTYPE, поэтому у меня нет возражений по поводу его изменения.   -  person Ultratrunks    schedule 25.08.2011


Ответы (3)


Вы где-то используете OleDb? (или что-то, что включает его заголовки) Он определяет тип DBTYPE (в oledb.h). Это может вызвать конфликт.

person Ferruccio    schedule 24.08.2011
comment
Похоже, что я не включаю OleDb, но я изменил имя перечисления с DBTYPE на DB_TYPE, как упоминал предыдущий комментатор, и ошибки исчезли. Должен быть какой-то конфликт во включении, которое не является частью проекта. - person Ultratrunks; 25.08.2011

Похоже, вы включаете, вероятно, косвенно, файл odbcbrowsegrid.h, и он содержит что-то с тем же именем, держу пари, в строке 29.

Так что вам просто нужно будет называть свое перечисление по-другому.

ПОСЛЕДУШНЫЕ РАЗМЫШЛЕНИЯ: если только... ваш файл на самом деле не odbcbrowsegrid.h. Тогда я сказал глупость.

person rodrigo    schedule 24.08.2011
comment
Защита включения не означает, что вы можете просто повторно объявить общедоступный идентификатор. Это означает только то, что очень вероятно, что вы не будете делать это с тем же файлом .h. <грамм> - person Rudy Velthuis; 25.08.2011

Чтобы получить эту конкретную ошибку, вам нужно сделать что-то вроде:

typedef int DBTYPE;
enum DBTYPE {DB_FOXPRO26, DB_OTHERS};

(Определение DBTYPE как перечисления дважды дает другую ошибку). Это означает, что, хотя защита включения (#define ODBCBROWSERGRID_H и т. д.) является хорошей идеей, она не решит эту проблему.

По сути, вы используете включаемый файл, который использует имя DBTYPE для какой-то другой цели. Вы можете отследить включаемый файл, выяснить, действительно ли вам нужен этот другой файл, а затем, если нет, выяснить, как избежать его загрузки ---- или вы можете просто дать своему DBTYPE другое имя. (рекомендуемые)

person James Curran    schedule 24.08.2011