JSON マーシャリング用の C++Builder アプリケーションでSuperObjectを使用しようとしています。
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 コードからテンプレートをインスタンス化する方法がわかりません。
何か案は?