2012-11-11 77 views
0

我在Linux上,並試圖編寫跨平臺的代碼。我知道模板很難在Windows上正確使用,但我不記得具體細節。Windows上的模板有什麼問題?有什麼解決方案?

我知道一個問題與模板調試和跨越dll邊界的模板有關,而不是如何解決它 - 或者甚至可能有解決方法。

我相信還有其他問題,但我只找到它們的模糊引用。

所以:Windows上的C++模板有什麼問題?除了不使用模板之外,還有哪些解決方案?


編輯:也許問題只與STL,而不是與一般的模板?

兩個引號:

不能暴露跨庫邊界STL電話上的窗口,沒有顯著頭痛。

封裝是必須的,我已經做窗戶上的dll邊界STL容器以及靜態庫的一些項目,這是不可能的,而不封裝使用。

+0

這取決於編譯,而不是操作系統... – unsym

+0

您的問題不夠具體。模板沒有特定的窗口問題。 Dll應該也可以,只要你不混合CRT,編譯器,並且不要將靜態鏈接的crts與dll混合使用。而不是從不受信任的來源讀取可疑信息(**誰說**「封裝是必須的」?這個人甚至經歷過?),爲什麼不簡單地嘗試在模板中使用dll並查看會發生什麼?如果遇到問題,您可以隨時詢問*特定問題。 – SigTerm

+0

@SigTerm這個人說,有多年的Windows開發經驗。我可以在vm上安裝windows並自己嘗試,但過去我一直在努力在windows上進行構建。 – Mark

回答

2

我知道模板很難在Windows上正確使用。

我從來沒有聽說過這樣的事情。聽起來像沒有根據FUD,我建議你完全忽略。

+0

我已更新該問題。也許問題只有'STL'? – Mark

+0

@Mark:推測你的意思是C++標準庫。 –

+0

我只談到它的一部分 - 模板。 「STL」是一個不完美的標籤,但人們通常知道它的含義。 – Mark

1

這裏有一個問題,from the MS KB編輯:這一個只適用於MSVC 5和6;我不支持這樣一個古老的編譯器的意圖,所以這是無關緊要的給我):

一些STL類包含嵌套類。這些類不能被導出。例如,deque包含一個嵌套類deque :: iterator。如果你導出deque,你會得到一個警告,你必須導出deque :: iterator。如果你導出deque :: iterator,你會得到一個警告,你必須導出deque。這是由設計的限制造成的,一旦模板類被實例化,它就不能被重新實例化和導出。目前唯一可以導出的STL容器是vector。其他容器(即map,set,queue,list,deque)都包含嵌套類,不能導出。

+0

IIRC,VC11的stdlib採用了SCARY迭代器,它將迭代器從父容器的分配器,比較器,散列器等中釋放出來。這不能用嵌套類實現,只能用freedef + typedef來實現。也許這不是問題了? – Xeo

+0

@Xeo我只是再次查看該頁面,它只適用於MSVC 5和6。 – Mark

相關問題