2

我目前正在尝试用 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 下编译?

4

2 回答 2

1

根据gcc bugtracker 上的这个错误报告,该问题是由在静态变量定义中指定默认值引起的。如果您像这样删除初始化,代码应该链接:

int Base<T>::type;

错误报告似乎已被解决为不是错误。尽管如此,您的示例在 GCC 4.4 中编译得很好。

要解决此问题,您可以使用带有构造函数的类类型,该构造函数将自动初始化自身。

于 2012-06-22T11:54:02.780 回答
0

是否添加

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

有帮助吗?

gcc 3.4 真的开始变老了,不能很好地适应模板巫术。

于 2012-06-22T10:51:33.097 回答