2014-09-03 2 views
0

, 찾을 수 없습니다 :템플릿 기능 링커 오류가 나는 상황을 다음 링크 오류 LNK2019

qutil.h

template <class T> 
bool isPrime(T number); 

qutil.cpp

#include "qutil.h" 
template <class T> 
bool isPrime(T number) 
{ 
    // 0 and 1 are not prime 
    // even numbers are not prime 
    if (number < 2 || number % 2 == 0) 
     return false; 
    // now we restrict our search to odd numbers 
    // greater than 2 
    for (T i = 3; i < number; i += 2) { 
     if (number % i == 0) 
      return false; 
    } 
    return true; 
} 

main_qutil.cpp

#include "qutil.h" 
... 
quint64 num = 10; 
qDebug() << num << "isPrime:" << isPrime(num); 

코드

cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"c:\Dev\QT484\include\QtCore" -I"c:\Dev\QT484\include\QtGui" -I"c:\Dev\QT484\include" -I"." -I"c:\Dev\QT484\include\ActiveQt" -I"debug" -I"c:\Dev\QT484\mkspecs\win32-msvc2008" -Fodebug\ @C:\DOKUME~1\Alain\LOKALE~1\Temp\nm124D.tmp qutil.cpp main_qutil.cpp

을하지만, 링커는 불평 : 오류없이 컴파일

Generating Code... link /LIBPATH:"c:\Dev\QT484\lib" /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /MANIFEST /MANIFESTFILE:"debug\qutil.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='' processorArchitecture=''" /OUT:debug\qutil.exe @C:\DOKUME~1\Alain\LOKALE~1\Temp\nm124E.tmp main_qutil.obj : error LNK2019: unresolved external symbol "bool __cdecl isPrime(unsigned __int64)" ([email protected][email protected]@[email protected]) referenced in function _main

어떤 생각?

+0

당신이'isPrime (NUM)를'사용하여 시도 적이 있습니까? 어딘가에 다른, 템플릿이 아닌 함수 isPrime에 대한 선언이있을 것입니다. –

+0

나는 단지 시험했다. 그러나 witout 성공 Timo! –

+0

나는 또한 동일한 오류를 생성하는 getNextPrime(), getPreviousPrime()과 같은 몇 가지 기능을 추가로 가지고있다. –

답변

1

템플릿 함수 선언을 헤더와 cpp 파일의 구현에 넣을 수는 없을 것이라고 생각합니다. 전체 템플리트 함수를 헤더 파일 (qutil.h)에 넣어야합니다.

비슷한 주제 : Storing C++ template function definitions in a .CPP file

+0

예, 도움이되었습니다. 같은 프로젝트에서 헤더 파일에 선언되고 cpp 파일로 구현 된 다른 템플릿 기능을 사용하기 때문에 놀랍습니다. –

+0

@AlainWeiler : 그렇지 않습니다. 전체 구현이 인스턴스화 시점에 표시되지 않는 한 C++ 컴파일러는 템플릿을 인스턴스화 할 수 없습니다. 헤더와 구현에 걸쳐 템플릿을 분할 한 경우 해당 구현 파일을 포함하거나 템플릿을 인스턴스화하지 않습니다. 그것들은 규칙이고, 당신은 그것들을 바꿀 수 없습니다. – IInspectable

관련 문제