3

さて、私はゲーム エンジンを 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++" に設定されています。

4

0 に答える 0