2011-03-24 46 views
14
##A.hh 

template<class T> void func(T t) {} 
template<> void func<int>(int t) {} 

void func2(); 

##A.cpp 

void func2() {} 

##main.cpp 

func("hello"); 
func(int()); 

我得到的錯誤是:錯誤LNK2005: 「無效__cdecl FUNC(INT)」(?? $ FUNC 3 H @@ YAXH @ Z)在A.OBJ已經定義, 一個或多個定義的符號發現函數模板專業化編譯錯誤

函數模板特化不被視爲普通函數模板嗎?它看起來像它將在A的目標文件中。

+0

是什麼'func2'有什麼關係呢? – 2011-03-24 09:48:58

+0

從你的錯誤信息我假設你使用VC。你的程序對VS2005工作正常 – mkaes 2011-03-24 09:49:51

+0

@ Space_C0wb0y所以我有一些東西要放在A.cpp文件中 – hidayat 2011-03-24 09:51:31

回答

26

由於template<> void func<int>(int t) {}是一個函數重載而不是函數模板(即所有類型在定義點已知,因此它不再是模板),它必須標記爲inline或在.cpp文件中定義,以避免多重定義錯誤,就像其他函數定義一樣。

+1

但是,如果它被當作普通函數處理,那麼與重載函數的區別是什麼: inline void func(int t){} – hidayat 2011-03-24 10:04:08

+4

@hidayat:重載解析優先是唯一的區別 - 非模板總是優於模板(見13.3.3)。 Herb Sutter在「More Exceptional C++」一書中詳細介紹了這一點。 – ildjarn 2011-03-24 10:08:39

10

問題如下:全模板專業化不再是一個模板,它更像是一個普通功能。所以,你應該採取相應的行動:

  • 在CPP文件

  • func<int>()要麼把定義或使其內嵌