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

Posted

技术标签:

【中文标题】C++/CLI:Public ref struct 生成 C2011:\'class\' 类型重新定义【英文标题】:C++/CLI: Public ref struct generates C2011: 'class' type redefinitionC++/CLI:Public ref struct 生成 C2011:'class' 类型重新定义 【发布时间】:2010-06-04 20:23:13 【问题描述】:

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

枚举.h:

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

...

此标头被 DLL 中的另一个类和单独的可执行文件引用。单独的托管结构正在生成:

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

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

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

非常感谢您的任何见解!

【问题讨论】:

【参考方案1】:

在使用托管代码时,您必须考虑一下传统的 C/C++ 头文件。类型声明的主要来源是程序集元数据。这与原生 C/C++ 编译模型非常不同,在原生 C/C++ 编译模型中,您必须拥有一个用于其他模块可见的类型的头文件。

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

不要将头文件用于导出的类型定义。始终使用程序集引用。

【讨论】:

您是对的——感谢您提供的信息!就在我以为我掌握了 C++/CLI 的窍门时......【参考方案2】:

我知道这个问题有点老了,但我写这个是为了将来使用: 我遇到了以下类似的问题: 托管 DLL 有一个托管类。 托管.h:

 namespace Managed     
        ref class CManagedClass ...
    

在一个未管理的类中,我想在上面的类中使用这个,所以在 unmanaged.h 中

#include "managed.h"

在另一个 DLL 中我也做了:

#include "unmanged.h"

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

namespace Managed 
    ref class CManagedClass;

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

【讨论】:

我遇到了类似的问题,但我希望我的 unmanaged.h 中的方法能够被内联,并且是模板。因此,我无法将您的解决方案与前向声明和 cpp 文件一起使用。我必须在我的 unmanged.h 中有完整的实现。我通过用#ifdef 封装#include "managed.h" 解决了我的问题:#ifdef FIRST_DLL_EXPORT #include "managed.h" #endif ..并仅在第一个dll 中设置FIRST_DLL_EXPORT,这样#include "managed.h"将被包含“unmanged.h”的任何其他 dll 忽略。

以上是关于C++/CLI:Public ref struct 生成 C2011:'class' 类型重新定义的主要内容,如果未能解决你的问题,请参考以下文章

C# 11 对 ref 和 struct 的改进

什么是定义网站中的ref struct

nodejs的Buffer有办法像c的结构体那样用吗

C++笔试

是否可以使用 ref-struct 和 ref-array 创建结构数组?

C# 结构文档:构造函数初始化器与 `ref` 和 `out` 参数的关系