私は現在、アルテミスのようなゲーム コンポーネント/エンティティ システムを C++ で書こうとしています。このシステムを、Android と iOS でアプリケーションを作成するためのMoSyncというクロスプラットフォーム ツールで動作させることを計画していました。
残念ながら、MoSync は現在古いバージョンの GCC を使用しており、Visual Studio でテストしていたライブラリを移植すると、大量のエラーが発生しました。これらのほとんどは解決できましたが、テンプレートに関するバグが 1 つあります。
私は小さな例を書きました
template <typename T>
struct Base
{
static int type;
};
struct Derived : public Base<Derived>
{
};
template <typename T>
int Base<T>::type(-1);
extern "C" int MAMain()
{
Derived d;
d.type = 0;
}
私のライブラリは、Curiously Recursive Template パターンを使用してコンポーネントを定義します。この例は、GCC 4.4 および Visual Studio 2010 で正常にコンパイルされます。ただし、MoSync (GCC 3.4.6 を使用) でこれをコンパイルしようとすると、このリンカ エラーが発生します。
C:\MoSync\workspace\pede\main.cpp: Error: Unresolved symbol '__ZN4BaseI7DerivedE4typeE',
このコンパイラでこれを機能させるための回避策はありますか? または、コンポーネントを定義する別の方法を見つける必要がありますか?
編集*実際には、さらに単純な例でこのエラーを発生させることができます:
template <typename T>
struct Component {
static int t;
};
template <typename T>
int Component<T>::t(-1);
extern "C" int MAMain()
{
Component<int>::t = 0;
}
このエラーが発生します
C:\MoSync\workspace\Components\main.cpp:9: Error: Unresolved symbol '__ZN9ComponentIiE1tE',
これは Curiously Recursive Template パターンとはまったく関係がないかもしれません。これを GCC 3.4.6 でコンパイルするにはどうすればよいですか?