2013-08-28 47 views
1

使用以下代碼獲得鏈接器錯誤(2001,無法解析的外部符號)。它只能與模板發生,我可以完全做無效,詮釋了同樣的事情,等頭文件中的C++模板

//a.h 

template<typename T> T foo(DWORD); 



//a.cpp 

#include "a.h" 

template<typename T> T foo(DWORD bar) 
{ 
    return T(); 
} 



//main.cpp 

#include "a.h" 

void something() 
{ 
    int hello = foo<int>(1); 
} 

它的工作,當我把foo的聲明頭文件中這樣

//a.h 

template<typename T> T foo(DWORD bar) 
{ 
    return T(); 
} 
+4

你應該閱讀有關[爲什麼模板只能在頭文件中實現] [1] [1]:http://stackoverflow.com/questions/495021/why-can -templates僅待實現的功能於該頭文件 – piotrekg2

回答

0

C++編譯器需要查看模板定義以執行隱式實例化。這意味着,如果C++編譯器在調用它時知道實現,則它只能自動爲模板函數調用生成目標代碼。

但是,您可以依賴顯式實例化。這意味着您要求編譯器爲您指定的模板的特定實例生成C++代碼。然後,在main.cpp中使用該模板時,鏈接時C++編譯器將能夠找到該實現(通過外部鏈接)。

//a.cpp 

#include "a.h" 

template<typename T> T foo(DWORD bar) 
{ 
    return T(); 
} 

template int foo<int> (DWORD); // explicit instantiation