如何在C 中调用外部模板功能
How can I call an externed template function in C++
可能的重复:
为什么仅在标题文件中实现模板?
我写了一个模板函数和函数中的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) { };
,请注意,如果您保持正常功能,那仍然是更好的匹配。
- C++:函数外部的超时功能
- NASM 调用外部C++功能
- C |声明类外部功能
- 当用作模板参数时,功能指针是否需要指向具有外部链接的函数
- 是否有一种方法可以让公共成员在班级外部无法解码,而无需访问包装器功能
- 如何在我的指针和阵列功能中修复未解决的外部错误-LNK2019和LNK1120
- 使用JNI访问外部本机功能
- 在外部功能中具有一个变量初始化或内部功能中的多个初始化是最有效的
- 错误LNK2019:未解决的外部符号-MSVC调试构建功能模板
- C 常数和骨料内部功能主体与外部
- 类功能中未解决的外部符号
- 如何在C 中调用外部模板功能
- 如何从窗口功能外部访问wm_command
- 主外部功能的C++ "unresolved external symbol"
- 从班级外部超载成员功能
- C++对 C 语言以外的语言的外部"C"功能
- 使用无功能的外部"C"
- 当它是指向类功能的指针时,如何正确调用函数,但在该类外部
- 将成员功能实现为外部功能
- 执行属于其他进程的外部功能