【发布时间】:2014-05-27 14:16:02
【问题描述】:
如果我在单独的编译单元中有一个模板函数(它从 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);
不产生代码,因为这将是一个 重载声明 ?这是正确的吗?
现在的问题是,让编译器在单独的编译单元中为模板函数或类生成代码的一般语法是什么?
【问题讨论】:
-
您的完整专用模板声明只是一个声明。那里没有定义,因此没有代码。它不是实例化。 (顺便说一句,这与 CUDA 无关)。
-
你说得对,它不会“产生代码”。要在编译单独的编译单元时“生成代码”,您需要在编译时(而不是链接时)访问模板声明和定义,从这里所有关于标头中的模板或显式实例化的讨论。因此,要让编译器为模板函数或类生成代码在编译时另一个编译单元您需要访问声明/定义,然后使用它或显式将其实例化 到该单元中。始终坚持 ODR。
标签: c++ templates compiler-construction object-files