是否存在非托管结构可以调用包含它的托管类的析构函数的情况?

时间:2018-04-28 02:10:24

标签: c++ templates c++-cli overloading destructor

我无法概念化如何判断错误,以及它实际上是如何实现的。

令人头疼的是,我正在将旧版C ++ MFC应用程序更新为C ++ / CLI,这需要将一些非托管类转换为托管类。在某些情况下,类包含12个不同的非托管结构和一个托管结构,因此我尝试使用嵌入式模板,如以下开发博客文章中所述:https://blogs.msdn.microsoft.com/branbray/2005/07/20/some-notes-about-mixed-types/

我使用的嵌入式课程如下所示:

template <typename T>
   ref class Embedded {
      T* t;
   public:
      !Embedded() {
         if (t != nullptr) {
            delete t;
            t = nullptr;
         }
      }

      ~Embedded() {
         this->!Embedded();
      }

      Embedded() : t(new T) {}

      static T& operator&(Embedded% e) { return (*e.t); }
      T* operator->() { return t; }
   };

引起我问题的课程如下:

ref struct Instance_t
{
   bool                                   Remote;
   uint32_t                               ID;
   UDPSocketMgr_t                         ^SockMgr;
   Embedded<MsgCounts_t>                  MsgCounts;
   Embedded<Connection_t>                 Connection;
   Embedded<PendingMsgFlags_t>            PendingMsgFlags;
   bool                                   SendPendingMsgs;
   Embedded<PROCESS_INFORMATION>          ProcInfo;

   // these copies of messages will be sent to new instances as the start up
   Embedded<RDI::PlatformAttributesMsg_t> PlatformAttributesMsg;
   Embedded<RDI::PoiFileMsg_t>            PoiFileMsg;
   Embedded<RDI::CommonControlsMsg_t>     CommonControlsMsg;
   Embedded<RTDI::ControlsMsg_t>          ControlsMsg;
   Embedded<RTDI::FlightPlanMsg_t>        FlightPlanMsg;

   Embedded<MessageManager_t> PaMsgMgr;
   Embedded<MessageManager_t> PoiFileMsgMgr;
   Embedded<MessageManager_t> CommonControlsMsgMgr;
   Embedded<MessageManager_t> ControlsMsgMgr;
   Embedded<MessageManager_t> SectorMsgMgr;
   Embedded<MessageManager_t> PolarPolyMsgMgr;
   Embedded<MessageManager_t> GeoPolyMsgMgr;
   Embedded<MessageManager_t> GeoPatchMsgMgr;
   Embedded<MessageManager_t> FlightPlanMsgMgr;
   Embedded<MessageManager_t> PoiListMsgMgr;
   Embedded<AckedMessages_t> AckedMsgs;
};

当我尝试编译代码时,收到的消息是:

&#39; AckedMessages_t&#39;:班级没有名为&#39;!嵌入式&#39;

的终结器

为了好奇,我创建了一个单独的数据类型并将其放在instance_t结构中,这导致错误消息转移:

&#39; MessageManager_t&#39;:类没有名为!Embedded&#39;

的终结器

问题显然在嵌入式模板中,但我无法弄清楚它可能会提示编译器认为非托管结构正在调用包装类的托管析构函数。

通常情况下,我会开始评论代码,直到我确定导致问题的特定行并提供最小的可验证示例,但遗留代码库在各种系统上是如此相互依赖,这样做可能需要本周半个星期。

有什么明显的东西我不见了吗?以前有没有人见过这样的东西?迫切需要任何帮助。

0 个答案:

没有答案