我有一个奇怪的问题。在 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": Multiple definition of "myFunc(int in)", first defined in "some file".
但是我该如何防止呢?因为它可以在 Windows 上运行,所以我想它也应该以某种方式在 Linux 上运行?
静态模板数据成员也是如此,它们与上面或多或少相同,只是您声明了一个变量而不是函数。如果它适用于静态模板数据成员,我会更喜欢。
如果其他一切都失败了,我想我仍然可以创建一个“MakeAll.cpp”文件,其中只包含所有 CPP,但这对我来说听起来不是一个理想的解决方案......
感谢您的帮助!
最佳答案
据我了解,您实际上是在多次定义您的模板特化,这也会给您带来 Windows 编译器的错误。
在您的头文件中,您通过提供主体来定义一个函数:
template<> void myFunc<int>(int in) { }
此定义将存在于多个编译单元中,链接器应该提示。
与普通非模板函数一样,同样的规则适用于你的模板特化:要么使用内联
,要么使用单独的声明和定义,通过放置
template<> void myFunc<int>(int in);
在标题中
template<> void myFunc<int>(int in)
{
// ...
}
在 .cpp
文件中。
关于c++ - Linux C++ : How to properly use template specializations across multiple files?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8971837/