我正在尝试在 C++Builder 应用程序中使用SuperObject进行 JSON 编组。
SuperObject 有一些通用函数来帮助解决这个问题:
TSuperRttiContext = class
...
function AsType<T>(const obj: ISuperObject): T;
function AsJson<T>(const obj: T; const index: ISuperObject = nil): ISuperObject;
end;
在生成的 .hpp 中,它们显示为这样。
class PASCALIMPLEMENTATION TSuperRttiContext : public System::TObject
{
...
template<typename T> T __fastcall AsType(const _di_ISuperObject obj);
template<typename T> _di_ISuperObject __fastcall AsJson(const T obj, const _di_ISuperObject index = _di_ISuperObject());
};
到目前为止一切都很好。我可以像这样编译代码
TMyObject * myObject = ...;
_di_ISuperObject obj = superRttiContext->AsJson(myObject);
String s = obj->AsString();
但是,我无法链接它。
[ILINK32 Error] Error: Unresolved external 'System::DelphiInterface<Superobject::ISuperObject> __fastcall Superobject::TSuperRttiContext::AsJson<TMyObject *>(const TMyObject * const, const System::DelphiInterface<Superobject::ISuperObject>)' referenced from C:\FOO.OBJ
现在,这并不完全出乎意料:Embarcadero DocWiki 说如果模板没有在Delphi代码中实例化,就会发生这种情况。
但是,这里的问题是 -TMyObject
是C++对象的后代TObject
,所以我看不到如何从 Delphi 代码实例化模板。
有任何想法吗?