2012-11-11 50 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

相关问题