C++ 模板函数应该是静态的吗?

C++ 模板函数应该是静态的吗?,c++,C++,我经常将源文件中的实用程序函数声明为static,以便在内部链接它们。现在,我有了一个包含许多模板函数的头文件(在命名的名称空间中)。我应该将它们也设置为静态以避免链接错误,还是模板函数的行为有所不同?模板函数是隐式的内联的(注意:不是它们的显式专门化)。因此,不会出现与同一函数的多个定义相关的链接器错误。实际上,inline现在主要被视为一个链接器指令,防止违反 理由 仔细想想,隐式禁用函数模板的ODR冲突最有意义 编译器在看到函数模板的定义时不会实例化它,而是在使用它时实例化:只有在使用函数

我经常将源文件中的实用程序函数声明为
static
,以便在内部链接它们。现在,我有了一个包含许多模板函数的头文件(在命名的名称空间中)。我应该将它们也设置为静态以避免链接错误,还是模板函数的行为有所不同?

模板函数是隐式的
内联的(注意:不是它们的显式专门化)。因此,不会出现与同一函数的多个定义相关的链接器错误。实际上,
inline
现在主要被视为一个链接器指令,防止违反

理由 仔细想想,隐式禁用函数模板的ODR冲突最有意义

编译器在看到函数模板的定义时不会实例化它,而是在使用它时实例化:只有在使用函数模板时,编译器才知道要在模板参数中替换哪些参数

为了能够实例化函数,编译器需要在调用站点查看函数模板定义,因此所述定义通常保存在声明函数模板的同一标头中。 因为这是一种常见的用法,所以隐式地将函数模板标记为inline可以节省一些输入

static
关于
static
关键字:当应用于非成员函数时,它将提供内部链接:该方法将仅在定义它的编译单元中可用


遵循函数模板的常用方法(在标题中的声明旁边提供定义),使它们成为
静态的
几乎没有什么好处:函数定义应该在看到函数声明的每个翻译单元中都可用。

内联的
似乎更合适。一旦被编译器实例化,模板就可以像普通函数一样工作。因此,如果在实例化的上下文中需要
static
,这很好。为了解决我在AIX上遇到的问题,我需要使用inline而不是static。由于某些原因,xlC不喜欢静态,但inline成功地将这些模板函数隐藏在链接器中<代码>IBM XL C/C++for AIX,V11.1(5724-X13)版本:11.01.0000.0002
谢谢@Jarod42