C ++ / CLI: публичная структура ссылок генерирует C2011: переопределение типа 'class' - PullRequest
15 голосов
/ 05 июня 2010

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

Enums.h:

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

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

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

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

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

Большое спасибо за понимание!

Ответы [ 2 ]

32 голосов
/ 05 июня 2010

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

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

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

1 голос
/ 25 апреля 2013

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

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

в неуправляемом классе. Я хотел использовать этот класс и так далее в неуправляемом.

#include "managed.h"

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

#include "unmanged.h"

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

namespace Managed {
    ref class CManagedClass;
}

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

...