为什么链接器找不到我在类中声明的模板函数?

时间:2013-08-19 16:35:34

标签: c++ templates c++11 linker android-ndk

嗯,标题说明了一切。链接(编译成功)时收到此消息:

F:/Android/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/ ../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.ex e: ./obj/local/armeabi/objs/hellondk/Player/Renderer.o: in function Renderer::On SurfaceCreated():jni/Player/Renderer.cpp:63: error: undefined reference to 'void GameObject::test<void>()'

GameObject.h:

class GameObject
{
    public:
    ...
    template<typename T> T test();
}

GameObject.cpp:

template<typename T> T GameObject::test()
{

}

Renderer.cpp(使用模板):

object = new GameObject();
...
object->test<void>(); // error here

2 个答案:

答案 0 :(得分:4)

您必须在头文件中定义模板函数,否则编译器将不知道在何处找到定义而只知道声明,这会给您一个链接器错误,就像您所拥有的那样。

答案 1 :(得分:0)

您将模板声明为test(),但您正在尝试调用名为testas()的函数。这可能是你的问题。 testas()定义在哪里?