С++/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, как обычно.