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

时间:2011-03-24 09:07:27

标签: c++ templates c++11 export

我理解“export”关键字可以用来通过头文件公开模板类或函数签名,并在库文件中抽象出实际的实现。
任何人都可以提供一个实用的示例程序,说明如何做到这一点? 使用它时是否有任何缺点或重点?

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

7 个答案:

答案 0 :(得分:40)

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

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

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

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

并让它按照您对常规功能的期望行事。

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

修改

(1)最后由Tom Plum找到我的参考Why can't we afford export (PDF),由Steve Adamczyk,John Spicer和Edison Design Group的Daveed Vandevoorde评论,他们最初在EDG前端实现了它。

答案 1 :(得分:12)

答案 2 :(得分:5)

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

关于如何在支持它的少数编译中使用导出的讨论(即Comeau C ++),check out this link也解释了导出难以实现的原因。

如果这是一次重大的反出口咆哮,那么道歉。我保证不讨厌出口!它并没有被广泛支持,你不能真正依赖它作为程序员。

答案 3 :(得分:1)

许多编译器供应商不支持它的原因是即使它工作也不会像程序员那样预期。

我在这些问题上找到的最好的文章是:

http://msmvps.com/blogs/vandooren/archive/2008/09/24/c-keyword-of-the-day-export.aspx

最好不要实例化模板。

答案 4 :(得分:0)

我读了一篇文章,其标题类似于导出不受支持,无论如何都不会做你想做的事。

如你所愿,做你想做的事的唯一方法是完全专业化。但更重要的是,如果你看不到库的源代码,那么就无法编译它。这意味着您无法接受来自它的动态内存,因为无法保证您将匹配删除用于新的。例如,如果我的代码是debug并且库是release,则删除器将不匹配new。您可以使用shared_ptr并提供删除器,但这是TR1并且没有导出。

答案 5 :(得分:0)

export 关键字在 C++20 中受支持,并与模块语言功能 (https://en.cppreference.com/w/cpp/language/modules) 一起使用。

答案 6 :(得分:-1)

C ++ 11现在拥有'extern templates',现代编译器已经很好地支持它了。