Используйте TDictionary в C++ Builder XE2

В настоящее время я хочу использовать TDitionary в C++ Buillder XE2

После прочтения документации я подумал, что это должно было быть легко, но я даже не могу создать TDictionary объект...

Мой код:

#include <vcl.h>
#pragma hdrstop
#include <Generics.collections.hpp>
#include "TDictionaryTest.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;

void __fastcall TForm2::FormCreate(TObject *Sender)
{
    TDictionary__2 <String, String> *Dir = new  TDictionary__2<String, String>(0);
    delete Dir;
}

Сообщения об ошибках:

[ILINK32 Error] Error: Unresolved external '__fastcall           System::Generics::Collections::TDictionary__2<System::UnicodeString,   System::UnicodeString>::~TDictionary__2<System::UnicodeString, System::UnicodeString>()'  referenced from ...\PRACTICE\C++\WIN32\DEBUG\TDICTIONARYTEST.OBJ
[ILINK32 Error] Error: Unresolved external '__fastcall System::Generics::Collections::TEnumerable__1<System::Generics::Collections::TPair__2<System::UnicodeString, System::UnicodeString> >::~TEnumerable__1<System::Generics::Collections::TPair__2<System::UnicodeString, System::UnicodeString> >()' referenced from ...\PRACTICE\C++\WIN32\DEBUG\TDICTIONARYTEST.OBJ
[ILINK32 Error] Error: Unresolved external 'System::Generics::Collections::TDictionary__2<System::UnicodeString, System::UnicodeString>::' referenced from ...\PRACTICE\C++\WIN32\DEBUG\TDICTIONARYTEST.OBJ
[ILINK32 Error] Error: Unresolved external '__fastcall System::Generics::Collections::TDictionary__2<System::UnicodeString, System::UnicodeString>::TDictionary__2<System::UnicodeString, System::UnicodeString>(int)' referenced from ...\PRACTICE\C++\WIN32\DEBUG\TDICTIONARYTEST.OBJ
[ILINK32 Error] Error: Unable to perform link

У кого-нибудь есть идеи? Спасибо!

2 ответа

Решение

Как сказал @mhtaqia, C++ пока не может создавать экземпляры классов Generics в Delphi, а только потреблять их, когда они созданы кодом Delphi. Для кода C++ вы должны использовать STL std::map вместо:

#include <map> 

void __fastcall TForm2::FormCreate(TObject *Sender) 
{ 
    std::map<String, String> *Dir = new std::map<String, String>; 
    delete Dir; 
} 

Или же:

#include <map> 

void __fastcall TForm2::FormCreate(TObject *Sender) 
{ 
    std::map<String, String> Dir; 
}

На заметку: никогда не используйте TForm::OnCreate а также TForm::OnDestroy события в C++. Это идиомы Delphi, которые могут приводить к недопустимому поведению в C++, так как они могут запускаться до вашего производного конструктора и после вашего производного деструктора, соответственно. Вместо этого используйте реальный конструктор / деструктор.

TDictionary только для доступа к переменным и полям Delphi. Вы не можете использовать и создавать его экземпляры в коде C++. Шаблонные классы можно использовать, когда они полностью определены в заголовочном файле.

Другие вопросы по тегам