Member 14373667 Ответов: 4

Получение ошибки C2011: 'profilesettings' : переопределение типа 'class'.


Когда я добавляю заголовочный файл из существующего проекта в новый проект dll ActiveX Control, получаю следующую ошибку :

ошибка C2011: 'ProfileSettings' : переопределение типа 'class'.

Странно то, что тот же самый заголовочный файл включен и в другие проекты, для которых во время сборки не получаются такие ошибки.

Что я уже пробовал:

Я посмотрел как можно больше решений от google, многие ответы включают в себя header guard, но тот же файл включен и в старые проекты, в которых не получается такой ошибки. Не могли бы вы мне помочь? Есть ли какая-то конфигурация проекта, которую я упускаю?

Заранее спасибо

KarstenK

Renameyour class-это самое простое решение.

4 Ответов

Рейтинг:
2

Richard MacCutchan

Мы не можем помочь без надлежащей подробной информации. Вам нужно проверить строку, где происходит ошибка, и поискать дубликат в других файлах. Visual Studio может выполнять поиск ссылок по всему проекту.


Рейтинг:
2

Rick York

Вот эксперимент, который вы можете попробовать. Вместо стандартного include file guard который выглядит следующим образом:

// HeaderFile.h

#ifndef HEADERFILE_H
#define HEADERFILE_H

// ... code goes here

#endif // HEADERFILE_H
измените его, чтобы сгенерировать ошибку, если она будет включена повторно, чтобы вы могли отследить проблему. Это будет выглядеть примерно так:
// HeaderFile.h - revised to generate an error on repeated inclusion

#ifndef HEADERFILE_H
#define HEADERFILE_H
#else
#error this file was repeatedly included
#endif

/***
#ifndef HEADERFILE_H     // this is here so it can be easily copy and pasted
#include "HeaderFile.h"  // and the file can be safely included when needed
#endif                 
 ***/

// ... code goes here
Это определение макроса вызовет ошибку, если вы включите его повторно, но вы можете использовать ifdef, который комментируется, и всегда делать это безопасно. Попробуйте это и посмотрите, указывает ли это на то, где ваша проблема.

Я делаю это во всех своих include-файлах, потому что это может значительно увеличить скорость компиляции в больших проектах. Я также делаю все заголовочные файлы автономными, то есть они включают в себя все, что им нужно для правильной компиляции, и эта привычка очень помогает.

Фу-у-у, я получил эту идею от Microsoft. Раньше они часто делали это в заголовках Win32 SDK, но теперь уже не так много, так как pragma один раз эффективно делает то же самое. Я предпочитаю получать ошибку, чтобы легче было отслеживать проблемы.


Рейтинг:
1

CPallini

Это может быть столкновение имен. Попробуйте изменить имя класса или, лучше, заключить его в пространство имен.
Кстати, в сообщении компилятора должно быть указано где оно уже было определено.


Member 14373667

Я проверил все вещи, связанные с классом, но я в замешательстве, потому что один и тот же файл включен в существующие проекты, где не получается ошибка во время сборки. И в новом проекте Имя классов определено с разными именами, поэтому не проблема с конфликтующим именем класса из-за нового проекта, я не мог поделиться кодами, так как это корпоративный проект.

Рейтинг:
1

Member 14373667

Всем Привет,

Спасибо за вашу помощь, я понял проблему.

В новом проекте была ссылка на один существующий проект. Ссылочный проект также включал файл с классом "ProfileSettings".

После установки ниже свойства в false, способный успешно построить :

Общие свойства --> ссылки --> (нажмите на ссылочный проект) --> вывод ссылочной сборки --> установить значение FALSE