Мне трудно понять, как сформулировать мою ошибку, а также как она может на самом деле произойти.
Чтобы сократить большую головную боль, я обновляю устаревшее приложение C ++ MFC до C ++ / CLI, и для этого требуется преобразовать некоторые неуправляемые классы в управляемые классы. В некоторых ситуациях существует класс, который содержит 12 различных неуправляемых структур и одну управляемую структуру, поэтому я пытаюсь использовать шаблон Embedded, как описано в следующем сообщении в блоге разработчика: 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;
};
Когда я пытаюсь скомпилировать код, я получаю сообщение:
'AckedMessages_t': класс не имеет финализатора с именем '! Embedded'
Ради любопытства я создал отдельный тип данных и поместил его в структуру instance_t, что привело к смещению сообщения об ошибке:
'MessageManager_t': у класса нет финализатора с именем! Embedded '
Проблема явно во встроенном шаблоне, но я не могу понять, что из-за этого может заставить компилятор думать, что неуправляемые структуры вызывают управляемый только деструктор класса-оболочки.
Обычно я начинаю комментировать код до тех пор, пока не смогу определить конкретную строку, вызывающую проблему, и предоставить минимальный проверяемый пример, но устаревшая кодовая база настолько взаимозависима в различных системах, что для этого, вероятно, потребуется половина неделя сама по себе.
Есть что-то очевидное, что я упускаю? Кто-нибудь когда-нибудь видел что-то подобное раньше? Любая помощь крайне необходима.