我目前正在尝试用 C++ 编写类似Artemis的游戏组件/实体系统。我计划让这个系统与一个跨平台工具一起工作,用于在 Android 和 iOS 上编写应用程序,称为MoSync。
不幸的是,MoSync 目前使用的是旧版本的 GCC,并且在移植我在 Visual Studio 中测试过的库时,我遇到了一大堆错误。其中大部分我可以解决,但有一个模板错误,我无法理解。
我写了一个小例子
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 Pattern 来定义组件。此示例在 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',
我想这可能与好奇递归模板模式根本没有任何关系。我该怎么做才能让它在 GCC 3.4.6 下编译?