如何在C 中调用外部模板功能

How can I call an externed template function in C++

本文关键字:外部 功能 调用      更新时间:2023-10-16

可能的重复:
为什么仅在标题文件中实现模板?

我写了一个模板函数和函数中的int type type inter main:

template <class T> T max (T a, T b) {    }
int main() {
    max(1,2);
}

正如大多数C 书籍所说,int max(int,int)功能将在编译器符合max(1,2)的编译时间内生成。

但是在另一个文件中,我写了int max(int,int)的声明并称其为称,但是编译器(实际上是链接器)捕获了一个错误,说找不到max(int,int)的参考。

extern int max(int,int);
max(1,2);    // Error:undefined reference to max(int,int)

那么,什么是错误的点,我该如何使用Extern而不是标头文件声明来调用最大(INT,INT)函数。

非常感谢。

这个问题仅回答了几千次。简短的形式是:使用时必须安排模板定义,以使编译器可以隐式实例化函数模板,或者必须明确实例化函数模板。

请注意,声明extern int max(int, int);声明非模板函数max()以两个int为参数。无论是否实例化,该引用将永远不会通过函数模板来满足。

extern int max(int,int);声明非模板函数。即使在您的另一个文件中可见,它也不匹配模板。

正确的方法是将模板放入标题中,并在任何地方都使用该函数(或者更好的是,使用标准库中已经可用的max模板)。

当您声明extern int max(int, int)时,您告诉编译器,在某个地方定义了此签名的功能,不一定在同一翻译单元中。extern实际上是多余的,因为功能默认情况下具有外部链接。

现在,您似乎认为此声明为使用t = int的模板函数实例化提供了定义。它没有,两者在任何方面都不相关。当编译器搜索呼叫max(1,2)的候选者时,优于函数模板优于功能模板。当它找到声明int max(int, int)时,它是一个完美的匹配,其工作已经完成 - 它甚至从未尝试实例化模板。汇编完成后,链接器应该找到定义,并且由于您尚未提供的定义,您将获得不确定的参考。

因此,您可以写一个定义

int max(int, int) { }

或明确告诉编译器使用模板

max<int>(1,2);

您也可以 peperipize int类型的模板

template<>
int max<int>(int, int) { };

,请注意,如果您保持正常功能,那仍然是更好的匹配。