Linux C ++:如何在多个文件中正确使用模板特化?

我有一个奇怪的问题。 在Windows上,使用Visual Studio 2010和英特尔编译器,所有内容都按预期方式链接。 但是当我尝试在Linux上使用CLang 3.0编译我的代码时,它会编译(如果我只使用一个CPP文件,它也会链接并运行),但是不会链接。

消息是有多个符号定义,指的是模板实例。 例如,考虑跨多个编译单元共享的头文件中的以下两行:

template<class T> void myFunc(T in) { } template<> void myFunc<int>(int in) { } 

现在从Linux链接器,我会得到一些东西:

“file xyz”:多个“myFunc(int in)”的定义,首先在“某个文件”中定义。

但是,我将如何防止呢? 既然它在Windows上工作,我想它也应该在Linux上工作?

静态模板数据成员也是如此,只不过是声明一个variables而不是一个函数。 我宁愿它是否适用于静态模板数据成员。

如果一切都失败了,我想我仍然可以创build一个“MakeAll.cpp”文件,其中只包含了所有的CPP,但这听起来不像是我想要的解决scheme。

谢谢你的帮助!

在我的理解中,你实际上是多次定义你的模板特化,这也会给你一个Windows编译器的错误。

在你的头文件中,通过提供一个body来定义一个函数:

 template<> void myFunc<int>(int in) { } 

这个定义将存在于多个编译单元中,链接器应该投诉。

与普通的非模板函数相同的规则适用于您的模板专业化:可以使用inline或使用单独的声明和定义,

 template<> void myFunc<int>(int in); 

在标题和

 template<> void myFunc<int>(int in) { // ... } 

.cpp文件中。

模板由编译器实例化,编译器负责确保它们只定义一次。

当你完全专门化一个功能,它不再是一个模板(而是一个普通的功能),这是你的责任,以确保它不是多重定义。

这些功能之间几乎没有什么区别

 template<> void f<int>(int x) { } void f(int x) { } 

当涉及到一个定义规则。

在这两种情况下添加inline都有帮助。

我现在手边没有这个标准,但我认为专业化必须inline宣布。