C ++模板类显式实例化失败,使用GCC / NDK

时间:2013-11-26 20:29:18

标签: android c++ templates gcc android-ndk

我在标题.hpp文件中有一个模板类:

Rage.hpp:

//various includes...

template<typename... Args>
class Rage : public PlatformManagerDelegate
{
    bool paused;

    //other variables...

public:
    Rage(Args... args);
    void pushInitialState(std::unique_ptr<State> state);

    //other methods...
};

它在源.cpp文件中的实现,在文件末尾有显式实例:

Rage.cpp

#include "Rage.hpp"
#include <android_native_app_glue.h>
//other includes...

template<typename... Args>
Rage<Args...>::Rage(Args... args) : paused(false)
{
    //some code...
}

template<typename... Args>
void Rage<Args...>::pushInitialState(std::unique_ptr<State> state)
{
    //some more code...
}

//more methods...

template class Rage<>;
template class Rage<struct android_app*>;

在main.cpp中编译以下内容

#include "Rage.hpp"
#include <android_native_app_glue.h>

void android_main(struct android_app* appState)
{
    app_dummy();

    Rage<>* clientInstance = new Rage<>();
    clientInstance->beginRun();
}

给出:

undefined reference to 'Rage<>::beginRun()'
undefined reference to 'Rage<>::Rage()'

这段代码使用Visual Studio 2013中的MSVC编译得非常好(显然将android_main改为标准的main函数),所以对我在GCC / NDK编译时看起来做错的任何帮助都不胜感激!

1 个答案:

答案 0 :(得分:1)

我不是Android开发人员所以我无法重现这个问题。从基本的C ++角度来看,它看起来好像具有实例化的文件未包含在构建中。好吧,这涵盖了缺少的构造函数实例化。成员beginRun()根本没有定义,但我认为它只是在复制代码时被删除,实际上是在Rage.cpp中定义的。