Я использую VS 2010 Ultimate. Набор инструментов v90.
У меня есть DLL и тестовый проект, который статически ссылается на DLL. Внутри DLL находится экспортируемый класс IFilter. Этот интерфейсный класс заключен в пространство имен, использование указанного класса явно прописано с использованием пространства имен, например. void DoSomethingWithDLLTypes (const Observer :: IFilter &);
В течение нескольких месяцев все работало нормально, однако с недавними изменениями вне проекта DLL я начал загружать новые файлы. Когда я добавлял эти файлы в решение, перестраивая с каждым добавлением к тесту, все работало хорошо, а затем внезапно я получил эту ошибку.
C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ include \ Filter.h (53): предупреждение C4099: 'Observer :: IFilter': имя типа, впервые увиденное с помощью 'class', теперь отображается с 'struct' d: \ proj \ pub \ h \ IFilter.h (12): см. объявление 'Observer :: IFilter' C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ include \ Filter.h (183): ошибка C2371: IFilter: переопределение; различные базовые типы C: \ Program Files \ Microsoft SDK \ Windows \ v6.0A \ include \ Filter.h (53): см. объявление 'IFilter'
Первоначально IFilter не был заключен в пространство имен, поэтому мне пришлось просмотреть все мои файлы (думая, что это решит эту проблему) и обернуть все в пространство имен. Теперь DLL компилируется нормально, однако я по-прежнему получаю ту же ошибку в тестовом проекте. Я даже не знаю, как / почему включается IFilter / Filter.h из MS SDK.
В тестовом проекте используются предварительно скомпилированные заголовки, однако он не использует Windows.h, в любом случае я пошел дальше и сделал там макрос #define lean_and_mean «на всякий случай», ничего не помогло.