在目标文件中显式生成模板代码
explicit template code generation in object file
如果我在一个单独的编译单元中有一个模板函数(它从CUDA C编译器NVCC产生一个后缀为。o的目标文件)
假设我们有定义(实现)
template<typename T>
void foo(T a){
// something
}
要在目标文件中生成显式代码,以便能够从另一个编译单元链接到它,我需要显式地实例化这个模板(对于我需要的所有模板参数):
template void foo<double>(double a);
template void foo<float>(double a);
这样做会在目标文件中产生实际的代码。
做其他事情,如:
template<> void foo<double>(double a);
template<> void foo<float>(float a);
不会在目标文件中产生代码,因为这是一个完全专门化的模板声明。这是正确的吗?
也void foo(double a);
void foo(float a);
不产生代码,因为这将是一个重载声明 ?这是正确的吗?
现在的问题是,使编译器在单独的编译单元中为模板函数或类生成代码的通用语法是什么?
通俗地说,当您这样写时:
template void foo<double>(double a);
template void foo<float>(double a);
您显式地告诉编译器用正确的模板参数实例化函数模板,因此您得到foo<double>
和foo<float>
的实现,就像您从函数模板中复制粘贴代码并用double
和float
替换T
一样。
另一方面,当你这样写时:
template<> void foo<double>(double a);
template<> void foo<float>(float a);
你告诉编译器foo<double>
和foo<float>
是完全不同的东西,与foo<T>
没有任何关系。这被称为专门化。然而,您没有为这些专门化提供定义,而只是声明:您只是告诉编译器这些东西存在,而不是它们是什么。专门化的定义应该是这样的:
template<>
void foo<double>(double a) {
// something else
}
根据你的意图,你可能想要:
- 使用显式实例化(如果
foo<double>
和foo<float>
共享相同的实现) - 使用不同的专门化,同时为这些专门化提供实际的定义
我猜你想要第一个。
相关文章:
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 从.o目标文件中提取函数的原始机器代码?
- 为不同目标MCU开发C/C++代码的区别
- CLion 没有调试我的目标之一 - 立即"进程已完成,退出代码为 0"
- 我在区分源代码、目标代码、汇编代码和机器代码时感到困惑
- 目标代码可以转换回LLVM IR吗?
- 如何在Visual Studio代码中的生成目标之间切换
- complex.h 适用于 Win32 目标以外的其他编译器,例如代码编辑器工作室 (CCS)
- 避免具有多个目标的重复CMAKE代码
- Turbo C++:为 malloc 函数生成目标代码
- 外部"C"已编译目标代码中的函数
- 没有要成为目标的规则:代码块
- 全屏获取c ++程序的输出.它是控制台输出窗口的目标代码
- 错误 C1190:托管目标代码需要'/clr'选项
- 当可以反编译时,ISV 如何隐藏其目标代码
- 如何在目标 c 中将 NSObject 传递给 cpp 代码
- 代码::块不制作目标文件
- 有什么工具可以为Windows目标编译C++2011代码
- EclipseCDT-带有现有代码的新Makefile项目-更改全局默认构建目标