【问题标题】:Why linker doesn't find my template function declared in class? [duplicate]为什么链接器找不到我在类中声明的模板函数? [复制]
【发布时间】:2013-08-19 16:35:34
【问题描述】:

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

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

【问题讨论】:

  • 不要再...在标题中定义模板,除非您真的知道自己在做什么及其含义。

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


【解决方案1】:

您必须在头文件中定义模板函数,否则编译器将不知道在哪里找到定义而只知道声明,这会给您带来与您所遇到的一样的链接器错误。

【讨论】:

  • 这是一个关于模板链接的漂亮小页面parashift.com/c++-faq-lite/… 它基本上描述了两种不同的解决方法,其中一种是上面的解决方案
【解决方案2】:

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

【讨论】:

  • 抱歉,复制粘贴错误,已修复。
  • 啊,我看到了编辑,但您在顶部的错误消息仍然显示testas()。这也是粘贴错误吗?
  • 是的,很抱歉:D。再次修复...
  • 好的,错误消息还指出您对test() 函数的调用试图传入ComponentType 作为参数,但您的定义没有参数。我已经在我的编译器上尝试了你的 sn-p 代码,它工作正常,肯定还有其他一些你可能遗漏的东西。
  • 再次修复...已将其移至头文件,现在可以正常工作了。
猜你喜欢
  • 2018-09-15
  • 2011-08-27
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多