the*_*int 5 c++ linux linker templates
我有一个奇怪的问题.在Windows上,使用Visual Studio 2010以及英特尔编译器,所有内容都按预期链接.但是当我尝试在Linux上使用CLang 3.0编译我的代码时,它确实编译(如果我只使用单个CPP文件,它也会链接和运行)但是没有链接.
消息是有多个符号定义,指的是模板实例化.例如,在多个编译单元共享的头文件中考虑以下两行:
template<class T> void myFunc(T in) { }
template<> void myFunc<int>(int in) { }
Run Code Online (Sandbox Code Playgroud)
现在从Linux链接器我会得到以下内容:
"file xyz":"myFunc(int in)"的多个定义,首先在"some file"中定义.
但是我该怎么做呢?既然它适用于Windows,我认为它应该在某种程度上适用于Linux?
对于静态模板数据成员也是如此,这些成员与您声明变量而不是函数或多或少相同.我更喜欢它是否适用于静态模板数据成员.
如果其他一切都失败了,我想我仍然可以创建一个"MakeAll.cpp"文件,其中包含所有CPP,但这对我来说听起来不是一个理想的解决方案......
谢谢你的帮助!
根据我的理解,您实际上是多次定义模板特化,这也应该为Windows编译器带来错误.
在头文件中,您通过提供正文来定义函数:
template<> void myFunc<int>(int in) { }
Run Code Online (Sandbox Code Playgroud)
该定义将存在于多个编译单元中,并且链接器应该抱怨.
与普通的非模板函数相同的规则适用于您的模板专业化:使用inline或使用单独的声明和定义,通过放置
template<> void myFunc<int>(int in);
Run Code Online (Sandbox Code Playgroud)
在标题和
template<> void myFunc<int>(int in)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
在一个.cpp文件中.
| 归档时间: |
|
| 查看次数: |
4187 次 |
| 最近记录: |