Используйте 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++. Шаблонные классы можно использовать, когда они полностью определены в заголовочном файле.