c++ - Linux C++ : How to properly use template specializations across multiple files?

标签 c++ linux templates linker

我有一个奇怪的问题。在 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/

相关文章:

c++ - 如何将 enable_if 用于互斥的非成员函数模板?

c++ - 为什么无符号整数容易出错?

c++ - 一台服务器向一个客户端发送数据。使用 select() 实现非阻塞 I/O

linux - 在 debian wheezy amd64 上安装 ia32-libs

c++ - 推断 CRTP 中模板化成员函数的返回类型

c++ - 实例化可变参数函数模板时出现奇怪的编译错误

c++ - OpenCV 无法使用 imwrite 写入图像

c++ stof()函数在多次工作后出错

c++ - 在数组成员 C++11 的类默认初始化程序中

linux - 如何链接到特定的 glibc 版本?