将export关键字与模板一起使用

Alo*_*ave 33 c++ templates export c++11

正如我所理解的那样,可以使用"export"关键字,以便可以通过头文件公开模板类或函数签名,并在库文件中抽象实际实现.
任何人都可以提供一个实用的示例程序,说明如何做到这一点?
使用此功能时是否有任何缺点或重点?

编辑:基于答案的后续问题.正如答案中所提到的,'export'在C++ 0x中已被弃用,即使对于C++ 03x也很少得到编译器的支持.鉴于这种情况,可以用什么方式隐藏lib文件中的实际实现,只是通过头文件公开声明,以便最终用户可以知道暴露的API的签名是什么,但是无法访问实现相同的源代码?

Mat*_* M. 41

首先:大多数编译器(包括gcc,Clang和Visual Studio)都不支持该export关键字.

它已在单个前端实现:EDG前端,因此只有使用它的编译器(Comeau和icc)才支持此功能.来自EDG实施者的反馈非常简单:它花了我们时间,非常复杂,我们建议不要实现它(1),因此它已被删除在C++ 0x中.

现在,标准允许(这至少由gcc实现):

  • 在标头中声明模板函数的专用版本
  • 在单个源文件中定义此特化

并使其表现得像你期望的常规功能.

注意:正如Johannes在评论中指出的那样,如果在标题中定义了函数的完全特化,则必须将其标记为内联,否则链接器将会抱怨.

编辑:

(1)最后找到了我的参考资料为什么我们不能负担出口(PDF)由Tom Plum,Steve Adamczyk,John Spicer和Edison Design Group的Daveed Vandevoorde评论,他们最初在EDG前端实现了它.


ltc*_*ltc 12

导出已从C++标准中删除.不要使用它.

  • 实际上,在c ++ 2003中定义了功能导出关键字.基本上没有编译器曾经实现过这种功能.在c ++ 2011中,该功能已从c ++标准中删除.export关键字仍然保留但没有功能.然而,海报清楚地询问了与从C++中删除的export关键字相关的c ++ 2003功能. (2认同)
  • 它又以模块的形式回归了。 (2认同)

tem*_*def 5

提供示例程序很困难,因为几乎没有编译器支持导出.g ++将报告一条警告说它不受支持,而IIRC甚至不会在Visual Studio中编译.此外,导出在C++ 0x中被弃用,这意味着未来的编译器根本不会支持它.

有关如何在支持它的少数编译中使用导出的讨论(即Comeau C++),请查看此链接,这也解释了导出难以实现的原因.

如果这是一个主要的反出口咆哮,请道歉.我保证不讨厌出口!它只是没有被广泛支持,你不能真正依赖它作为程序员.