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+;+;]带静态关键字的函数模板_C++_Templates - Fatal编程技术网

C++ [C+;+;]带静态关键字的函数模板

C++ [C+;+;]带静态关键字的函数模板,c++,templates,C++,Templates,来自谷歌v8 js引擎的代码,allocation.h: template <typename T> static void DeleteArray(T* array) { delete[] array; } 模板 静态void DeleteArray(T*数组){ 删除[]数组; } 这是一个函数模板(顶层,不在任何类中)。 但是static关键字的作用是什么?static函数(类外)不能使用。这是C语言中没有名称空间的遗留问题。我打赌您会发现,除非在另一个文件中重新定

来自谷歌v8 js引擎的代码,allocation.h:

 template <typename T>
 static void DeleteArray(T* array) {
  delete[] array;
}
模板
静态void DeleteArray(T*数组){
删除[]数组;
}
这是一个函数模板(顶层,不在任何类中)。
但是static关键字的作用是什么?

static
函数(类外)不能使用。这是C语言中没有名称空间的遗留问题。我打赌您会发现,除非在另一个文件中重新定义了
DeleteArray()
,否则不会从另一个文件调用它。

它是一个模板实际上是一个次要问题

它是静态的,意味着函数在文件外部不可见(但由于它在头文件中,而头文件实际上是包含它们的文件的一部分,这意味着在包含头文件的文件外部;而包含头文件的每个文件实际上都有其自己的、相同但私有的函数版本)

发件人:

“修改变量或函数时 在文件范围中,static关键字 指定变量或 函数具有内部链接(its) 名称从外部不可见 在其中声明它的文件。“

请参阅此处,了解在头文件中包含此项的更多含义:


关键字
static
给出了“内部链接”的定义,这意味着在不同的源文件中赋予名称
DeleteArray
另一种含义或不同的定义是合法的。(就像
static void f();
static int i;
的情况一样),但我无法想象有人会想这样做


<>使用<代码>静态< /代码>,禁止C++中的这种方式。如果不使用
static
关键字,这个声明可能会更好,使它隐式地
外部
(仍然是
内联
)。在这种情况下,链接器将被允许为来自多个对象的相同
T
组合
DeleteArray(T*)
的任何定义,因为它们将是相同的东西。

它做的事情与正常情况相同,头文件中的非模板
静态
函数:因为它几乎肯定会成为一个内联函数,所以我要说“不多”;)这个上下文中的static已经被弃用,取而代之的是匿名名称空间。我个人认为这是一个错误(因为它在头文件中)。它可能应该通过
inline
而不是
static
来标记。在此上下文中,“内联”让编译器知道在不同的编译单元中有一个函数的多个版本,因此它应该在链接时选择一个版本(如果某些函数实际上没有被内联)。@Martin:对于模板,“内联”应该不需要。模板总是隐式内联的?编译单元中的私有模板不会公开链接器的符号名,以解析与的依赖关系。