2011-03-07 37 views
4

當您在包含模板化數據成員的MSVC的公共接口中創建結構時,您將在編譯時收到警告。在MSVC中導出模板實際上有什麼好處?

一種解決方案是在DLL中導出模板類型(請參閱this知識庫文章)。

我在問這個問題,因爲我不知道爲什麼要導出類型?

  1. 如果您不導出它,則.hpp文件將擁有足夠的信息來自行生成該類型。

  2. 如果它是一個標準庫類型,並且您有兩個或多個dll的每個潛在鏈接到不同版本的標準庫,您現在已在您的代碼中具有相同類型的多個二進制版本。

這是什麼意思?如果實際上有兩種不同的版本,編譯器認爲它們是相同的,但是#2在運行時可能會導致崩潰,但是由於缺少符號,#2可能會無法加載?

我完全脫離基地嗎?在我看來,最好的選擇是忽略MSVC的警告。

編輯:沒有人指出了這一點,但我知道並明白,如果你有你的模板中的靜態,並希望在單個應用程序內的DLL的所有用途共享這些靜態:您必須在這種情況下,導出模板實例化。這對於像單物一樣的物體和記錄器等是很重要的。

+1

我們在這裏禁用了該警告,並且從來沒有出現問題。可能只是運氣強硬。 – stijn

+0

最終,禁用警告也是我們同時使用的路線。 – lefticus

回答

1

#2是即刻死亡。如果你想在DLL接口中使用標準類型,你必須保證使用的代碼是a)動態鏈接到相同的CRT DLL,並且b)使用相同的頭文件編譯。

#1存在,因爲你不能保證被調用的代碼與你相同 - 例如專業化等。這沒有什麼錯,如果你自己編寫這個類,並保證客戶端和DLL看到完全一樣的類。

+0

那麼這是否意味着您同意我的評估,即禁用警告是唯一真正的答案?要麼你有相同的版本,一切正常,或者你沒有相同的版本,你要麼1)崩潰或2)不能互操作? – lefticus

+0

@lefticus:警告一般不應禁用 - 它們很重要。你應該在類型的基礎上禁用它們,也就是說,只有你知道的類型被全部定義在共享頭文件中。 – Puppy

+0

我想我應該澄清,我特指標準庫類型。那些在標題中沒有完全實現的,你沒有真正的控制權。然而,這個問題幾乎沒有任何意義,因爲我明確鏈接的知識庫文章說可能導出的唯一類型是std :: vector。 – lefticus

相關問題