我在标题.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编译时看起来做错的任何帮助都不胜感激!
答案 0 :(得分:1)
我不是Android开发人员所以我无法重现这个问题。从基本的C ++角度来看,它看起来好像具有实例化的文件未包含在构建中。好吧,这涵盖了缺少的构造函数实例化。成员beginRun()
根本没有定义,但我认为它只是在复制代码时被删除,实际上是在Rage.cpp
中定义的。