Functions.h:的函數模板明確分工導致鏈接錯誤
#pragma once
#include <iostream>
template<class T> void TemplatedFunction(T* p) {}
template<> void TemplatedFunction<float>(float* p) {}
template<> void TemplatedFunction<char>(char* p) {}
Functions.cpp:
#include "Functions.h"
void Test()
{
TemplatedFunction<float>(NULL);
TemplatedFunction<char>(NULL);
}
main.cpp中:
#include "Functions.h"
void Test();
int main()
{
Test();
return 0;
}
生成錯誤:
main.obj : error LNK2005: "void __cdecl TemplatedFunction<float>(float *)" ([email protected]@@[email protected]) already defined in Functions.obj
main.obj : error LNK2005: "void __cdecl TemplatedFunction<char>(char *)" ([email protected]@@[email protected]) already defined in Functions.obj
我知道兩種方法來解決這個問題:
不包括Functions.h幾個.cpp文件 - 不能在複雜的工程應用,如果H-文件包含許多需要一些額外的定義。 cpp文件。
聲明所有模板函數爲
static
。但是這意味着特定的函數會出現在包含Functions.h的所有.cpp文件中,即使它們未被使用,這可能會導致代碼重複。
所以,我看到專門的模板功能就像非模板化功能一樣。如果沒有static
聲明,是否有其他解決方案來防止鏈接器錯誤?如果函數聲明爲static
,現代C++編譯器是否將它們從優化構建中刪除,如果它們未被使用?
編輯。 閱讀前兩個答案後:我不問在這裏如何防止此類鏈接器錯誤。假設我不能將專業化移動到.cpp文件並將其保留在012h或inline
的.h文件中,這是否會導致代碼複製和優化版本中的膨脹,當這些函數被添加到包含.h文件的每個.cpp文件時,即使他們沒有使用?
顯式特化的主體需要像普通的非模板函數一樣進入cpp文件(這就是它們)。如果你願意(或者有意義),你可以用'inline'交替標記它們。 – dlf 2014-08-27 14:30:58