2014-09-03 116 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); 

code編譯沒有錯誤:

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。 – 2014-09-03 23:28:36

+0

我剛剛嘗試過,但是Timo成功了! – 2014-09-03 23:38:16

+0

我也有一些更多的功能,如getNextPrime(),getPreviousPrime(),它們會產生相同的錯誤。 – 2014-09-04 06:03:34

回答

1

我不認爲你可以把一個模板函數聲明放在一個頭文件和一個cpp文件中的實現。你必須將整個模板函數放在頭文件(qutil.h)中。

類似的話題:Storing C++ template function definitions in a .CPP file

+0

是的,這有幫助! 我很驚訝,因爲在同一個項目中,我正在使用在頭文件中聲明並在cpp文件中實現的其他模板函數。 – 2014-09-04 21:42:31

+0

@AlainWeiler:你不是。 C++編譯器不能實例化模板,除非整個實現在實例化時可見。如果您將模板分割爲頭和實現,則要麼包含該實現文件,要麼不是實例化模板。這些是規則,你不能改變它們。 – IInspectable 2016-12-30 17:12:39