Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象文件中的显式模板代码生成_C++_Templates_Compiler Construction_Object Files - Fatal编程技术网

C++ 对象文件中的显式模板代码生成

C++ 对象文件中的显式模板代码生成,c++,templates,compiler-construction,object-files,C++,Templates,Compiler Construction,Object Files,如果我在一个单独的编译单元中有一个模板函数(它从CUDA C编译器NVCC生成一个后缀为.o的对象文件) 假设我们有了定义(实现) 不会生成代码,因为这将是一个重载声明?这是正确的吗 现在的问题是,让编译器在单独的编译单元中为模板函数或类生成代码的通用语法是什么 用外行的话说,当你写这篇文章时: template void foo<double>(double a); template void foo<float>(double a); template<>

如果我在一个单独的编译单元中有一个模板函数(它从CUDA C编译器NVCC生成一个后缀为.o的对象文件)

假设我们有了定义(实现)

不会生成代码,因为这将是一个重载声明?这是正确的吗


现在的问题是,让编译器在单独的编译单元中为模板函数或类生成代码的通用语法是什么

用外行的话说,当你写这篇文章时:

template void foo<double>(double a);
template void foo<float>(double a);
template<> void foo<double>(double a);
template<> void foo<float>(float a);
您告诉编译器
foo
foo
是完全不同的东西,与
foo
没有任何关系。这叫做专门化。但是,您并没有为这些专门化提供定义,只提供声明:您只是告诉编译器这些东西是存在的,而不是它们是什么。专业化的定义如下所示:

template<>
void foo<double>(double a) {
    // something else
}
模板
无效foo(双a){
//别的
}
根据您的意图,您可能希望:

  • 使用显式实例化(如果
    foo
    foo
    共享相同的实现)
  • 使用不同的专门化,同时提供这些专门化的实际定义

我猜您想要第一个。

您完整的专用模板声明只是一个声明。这里没有定义,因此没有代码。它不是一个实例。(顺便说一句,这与CUDA无关)。您认为它不“生成代码”是正确的。要在编译一个单独的编译单元时“生成代码”,您需要在编译时(而不是链接时)访问模板声明和定义,从这里可以了解关于头中模板或显式实例化的所有讨论。因此,要让编译器在编译另一个编译单元时为模板函数或类生成代码,您需要访问声明/定义,然后使用它或显式地将其实例化到该单元中。始终坚持ODR。
void foo(double a);
void foo(float a);
template void foo<double>(double a);
template void foo<float>(double a);
template<> void foo<double>(double a);
template<> void foo<float>(float a);
template<>
void foo<double>(double a) {
    // something else
}