2012-04-24 59 views
2

我學習如何創建一個使用Visual Studio 2010中那麼測試多個符號庫,我只是寫 -圖書館與多個模板定義

add.cpp

template <typename T> 
T fooBar(T a1, T a2) 
{ 
    return (a1+a2); 
} 

減。 cpp

template <typename T> 
T fooBar(T a1, T a2) 
{ 
    return (a1-a2); 
} 

就我所知,模板是一個編譯時間的概念。爲了測試這個工具在函數/函數模板之間的行爲,我寫了上面的內容。它成功創建了.lib,即使在爲功能模板設置的最高級別上也沒有任何警告。如何在正常功能的情況下發出警告。

add.obj:警告LNK4006: 「INT __cdecl foobar的(INT,INT)」(?FOOBAR @@ @ YAHHH Z)在subtract.obj已經定義;第二個定義被忽略

add.obj:警告LNK4221:找不到公共符號;檔案成員將無法訪問

爲什麼該工具對功能和功能模板的行爲不同?

+0

您是否嘗試過檢查'.lib'你滾出去? – 2012-04-24 20:42:52

+0

從哪裏引用這些函數?我很擔心你在'.cpp'文件中定義了這些文件,而不是在'.h'或'.hxx'文件中。可能創建'.lib'沒有任何警告/錯誤,因爲你根本沒有編譯它們。 – 2012-04-24 20:43:41

+0

您是否嘗試實例化模板函數,例如,通過編寫如下所示的內容:int a; int b; int c = fooBar(a,b); ?否則,編譯器永遠不會實例化模板,也不必在兩者之間選擇。 – ds1848 2012-04-24 20:46:54

回答

2

由於它們是模板化函數,因此只有在實際實例化模板函數之後,函數本身才會被編譯。

舉例來說,我只是把我的.cpp文件中的一個下面的代碼不使用它和.cpp文件的編譯經過精細去(儘管明顯的語法錯誤):

template <typename J> 
int foobar(J junk) 
{ 
#pragma message("Compiling foobar") 
    ppp = 35; 

    return 0; 
} 

它不是直到我嘗試編譯它(也就是創造它的編譯器實例):

int main(void) 
{ 
    double x; 
    int y = foobar(x); 
    return 0; 
} 

做我得到一個編譯錯誤。

: error C2065: 'ppp' : undeclared identifier 

試試這個你自己的,它可能幫你解釋你所看到的(至少在你提到的第一種情況下,缺乏的錯誤。)

+0

如果沒有模板實例化,我能否認爲模板沒有任何警告? – Mahesh 2012-04-24 21:26:51

+0

@Mahesh是...... – Ricibob 2012-04-24 21:29:35

+0

它根本沒有編譯,所以沒有重複的符號等。您將不會收到任何警告或錯誤或任何其他信息。如果你在'foobar'函數裏面放了一個'#pragma消息(「編譯foobar」)',你會看到它編譯的時候。 – 2012-04-24 21:30:13