2

私は現在、アルテミスのようなゲーム コンポーネント/エンティティ システムを 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 でコンパイルするにはどうすればよいですか?

4

2 に答える 2

1

gccバグトラッカーに関するこのバグレポートによると、この問題は静的変数定義でデフォルト値を指定することによって引き起こされます。初期化を次のように削除すると、コードがリンクするはずです。

int Base<T>::type;

バグレポートはバグではなく解決されたようです。それにもかかわらず、サンプルはGCC4.4で正常にコンパイルされます。

これを回避するには、自動的に初期化するコンストラクターでクラス型を使用できます。

于 2012-06-22T11:54:02.780 に答える
0

追加しますか

int Base<Derived>::type(-1);

役立ちますか?

gcc 3.4 は本当に古くなり始めており、テンプレート ソーサリーとうまく連携できません。

于 2012-06-22T10:51:33.097 に答える