2013-08-19 2 views
0

글쎄, 제목은 모든 것을 말합니다. 링크 할 때 나는이 메시지가 (컴파일이 성공) :링커에서 클래스에 선언 된 템플릿 함수를 찾지 못하는 이유는 무엇입니까?

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 
+1

헤더에 템플릿을 정의하지 않으려면 ** 실제로 ** 수행중인 작업과 그 의미를 알아야합니다. –

답변

1

헤더 파일에 템플릿 함수를 정의해야합니다. 그렇지 않으면 컴파일러가 정의를 찾을 위치를 알지 못하며 선언과 같은 링커 오류가 발생합니다.

+1

다음은 템플릿과 연결되는 멋진 작은 페이지입니다. http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl.html 기본적으로 두 가지 해결 방법이 설명되어 있습니다 , 그 중 하나가 위의 해결책입니다 – Lochemage

0

템플릿을 test()으로 선언했지만 testas()이라는 함수를 호출하려고합니다. 이것은 귀하의 문제 일 수 있습니다. testas()은 어디에 정의되어 있습니까?

+0

죄송합니다, 복사 - 붙여 넣기 실수, 고정. –

+0

아, 편집을 보았습니다.하지만 상단의 오류 메시지는 여전히'testas()'라고 말합니다. 그것도 붙여 넣기 오류입니까? – Lochemage

+0

네, 죄송합니다. D. 다시 수정되었습니다 ... –

관련 문제