如果我在单独的编译单元中有一个模板函数(它从 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>
就像您从函数模板中复制粘贴代码并替换 T
一样与 double
和float
.
另一方面,当你这样写时:
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>
共享相同的实现) - 使用不同的特化,同时为这些特化提供实际定义。
我猜你想要第一个。
关于c++ - 目标文件中的显式模板代码生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23891881/