Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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++_Unix - Fatal编程技术网

C++ 模板的符号表条目

C++ 模板的符号表条目,c++,unix,C++,Unix,我对模板函数有疑问。 如果我写一个普通函数,比如 int function1(int x); int function1(int x, int y); 将为功能1创建两个符号表条目。 每个条目表示每个重载函数 对于模板函数,具体发生了什么以及编译器如何处理它 template<class X> int function1(X a); 模板 int函数1(xa); 模板函数将有多少个符号表条目?请确定“每个实例化一个” 当您使用特定的模板参数创建函数模板的实例时,编译器将生成一个

我对模板函数有疑问。 如果我写一个普通函数,比如

int function1(int x);
int function1(int x, int y);
将为功能1创建两个符号表条目。 每个条目表示每个重载函数

对于模板函数,具体发生了什么以及编译器如何处理它

template<class X>
int function1(X a);
模板
int函数1(xa);
模板函数将有多少个符号表条目?

请确定“每个实例化一个”


当您使用特定的模板参数创建函数模板的实例时,编译器将生成一个重载方法。所以当你使用这个方法的时候

temlate<class X>
int function1(X a);
这些是重载的,将有2个符号


事实上,
模板
非常类似于
,具有强大的类型检查功能。编译类型时,函数模板将替换为实际实例。在
对象
代码中不存在模板函数,只有实例化重载(如果有)。

如果没有人使用模板创建编译函数,实际上符号表中不会创建任何条目。否则,对于模板的每次不同使用(如果有多个类型参数,则针对每个类型或类型组合),将创建一个或多个编译函数,从而在符号表中创建一个或多个条目


模板仅在编译时进行评估;编译后,它们不再存在。

C++中没有“模板函数”。有“函数模板”,即用于创建函数的模板(或者蓝图)。一旦你接受了这一点,答案就会变得更容易发现

模板纯粹是一种编译构造。从模板实例化的每个函数(自然)都是一个函数,因此它有自己的符号


与内联函数一样,如果在不同的转换单元(=不同的.cpp文件)中从模板实例化了一个相同的函数(=使用相同的模板参数集),编译器和链接器必须确保将这些函数合并为一个函数,因为它们的地址必须相同。他们如何做到这一点是他们的一个实施细节;标准只是要求他们必须这样做。恐怕我不知道如何做到这一点的技术细节,所以我不能提供一个示例。

可能每个实例都有一个。对于“答案”来说还是有点短。还有更多的话要说。如果你不必多说,你最好给出评论。从别人的答案中复制一个例子,没有附带解释,并不能改善这个答案。我最喜欢这个答案,但它忽略了一点,即使用相同模板参数的多个实例化不会创建多个函数(或者它们融合在一起)@nwp不幸的是,我对它的实际工作原理知之甚少;我可以添加一个一般的声明,但不只是更多。@ NWP:不幸的是,这是一个问题,因为C++标准不关心琐碎的细节(它只是命令结果)。合并它们是一个工具链问题,每个工具链都可以自由使用他们认为合适的任何方法来解决这个问题。@MatthieuM。那么这个答案现在差不多是最好的了。很好,谢谢你的回答。但我的问题是我在一个共享对象中有一个函数模板,我想从共享对象中使用这个函数。如果它在遇到函数调用时创建符号引用,我就不能在共享对象中使用模板。但是,如何在标准C++模板中处理这些操作。这就是我想知道的。
temlate<class X>
int function1(X a);
function1<int>(5);
function1<double>(5.0);
int function1(int a);
int function1(double a);