さて、私はゲーム エンジンを iOS に移植していて、奇妙な問題にぶつかりました。私たちのエンジンは、char と wchar_t に特化したテンプレート化された String クラスを定義します。このクラスには、静的な「s_empty」プロパティがあります。
// MyString.h
namespace MyEngine
{
template <typename T> class String
{
...
static const String s_empty;
};
...
}
//MyString.cpp
namespace MyEngine
{
template <> String<char> const String<char>::s_empty;
template <> String<wchar_t> const String<wchar_t>::s_empty;
// Yes, compiler forces me to start with "template <>"
...
}
プロジェクトの別のモジュールは、この変数を利用しています:
const MyEngine::String<wchar_t> &f()
{
return MyEngine::String<wchar_t>::s_empty;
}
この機能は、さまざまなプラットフォームやさまざまなコンパイラ (MSVC+PC86、Codewarrior+NDS、Wii) で何年にもわたって完全に機能しています。また、デバイス上の iOS では機能しますが、シミュレーターでは機能しません! シミュレーターでは、リンカーがエラーを生成します。
アーキテクチャ i386 の未定義シンボル: "MyEngine::String<wchar_t>::s_empty"
ヘルプ!)
PS "Compile Sources As" は "Objective-C++" に設定されています。