С++/CLI: public ref struct генерирует C2011: переопределение типа класса

У меня есть файл заголовка в управляемом DLL-проекте, например:

Enums.h:

#pragma once
...
public ref struct ManagedStruct {
    Bitmap^ image;
}
...

Этот заголовок ссылается как на другой класс в DLL, так и на отдельный исполняемый файл. Только управляемая структура генерирует:

ошибка C2011: "ManagedStruct": переопределение типа "класс".

Если я переведу структуру в основной файл заголовка в DLL, он отлично работает и общедоступен, так что я делаю, но мне очень хотелось бы узнать, почему это происходит, когда я просто перемещаю его в другой файл.

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

Спасибо за понимание!

Ответы

Ответ 1

Вы должны отменить традиционный заголовочный файл C/С++, подумайте немного, когда работаете с управляемым кодом. Основным источником объявлений типа являются метаданные сборки. Это сильно отличается от исходной модели компиляции C/С++, где у вас должен быть заголовочный файл для типов, которые вы делаете видимыми для других модулей.

Я собираюсь предположить, что вы получите эту ошибку C2011 в проекте EXE. Если вы оба добавили ссылку на сборку проекта DLL (как и следовало ожидать) и использовали #include в файле заголовка. Как и вы не должны. Это гарантированное дублирующее определение, #pragma однажды не исправляет это.

Не используйте файлы заголовков для экспортированных определений типов. Всегда используйте ссылки на сборку.

Ответ 2

Я знаю, что этот вопрос немного устарел, но я пишу это для будущего использования: У меня была следующая проблема: У управляемой DLL был управляемый класс. managed.h:

 namespace Managed {    
        ref class CManagedClass {...}
    }

в неизмененном классе я хотел использовать этот выше класс, и поэтому в unmanaged.h

#include "managed.h"

в другой DLL я также сделал:

#include "unmanged.h"

который разрешен в ошибке переопределения типа. Я нашел решение этой проблемы, используя следующий метод: вперед в unmanaged.h

namespace Managed {
    ref class CManagedClass;
}

и включите файл manage.h в файл unmanaged.cpp, как обычно.