C ++ / CLI:Public ref struct生成C2011:'class'类型重定义

时间:2010-06-04 20:23:14

标签: windows visual-c++ dll c++-cli

我在托管DLL项目中有一个头文件,如下所示:

Enums.h:

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

此标头既可以从DLL中的另一个类引用,也可以从单独的可执行文件引用。仅托管结构生成:

  

错误C2011:'ManagedStruct':'class'类型重新定义。

如果我将结构移动到DLL中的主头文件,它可以正常工作,并且可以公开访问,这就是我正在做的事情,但我非常想知道为什么当我移动它时发生这种情况到另一个文件。

我检查了所有必要的包含和名称空间并尝试了明显的标题保护,但无济于事;我仍然得到错误。

非常感谢任何见解!

2 个答案:

答案 0 :(得分:31)

在使用托管代码时,您必须对传统的C / C ++头文件进行一些调整。类型声明的主要来源是程序集元数据。这与本机C / C ++编译模型非常不同,在本机C / C ++编译模型中,您拥有以获得对其他模块可见的类型的头文件。

我猜你在EXE项目中得到了这个C2011错误。你们都添加了对DLL项目程序集的引用(就像你应该)在头文件中使用了#include。就像你不应该。这是一个有保证的重复定义,#pragma曾经不能解决这个问题。

不要将头文件用于导出的类型定义。始终使用装配参考。

答案 1 :(得分:1)

我知道这个问题有点陈旧,但我写这篇文章以备将来使用: 我有以下问题,这是类似的: 托管DLL有一个托管类。 managed.h:

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

在一个unamanged类中我想使用上面的类,所以在unmanaged.h中

#include "managed.h"

在另一个DLL中我也做了:

#include "unmanged.h"

在类型重定义错误中解决了。 我使用以下方法找到了解决此问题的方法: unmanaged.h中的前向声明

namespace Managed {
    ref class CManagedClass;
}

并像往常一样将managed.h包含在unmanaged.cpp文件中。