首页 > 编程知识 正文

函数的原型声明有哪些形式,用函数模板定义的函数没有类型

时间:2023-05-03 17:12:40 阅读:24590 作者:3510

在常规函数中,声明可以放置在头文件中,定义可以放置在源文件中,如果在其他位置使用该函数,则只需要包含头文件。 由于编译器是以源文件为单位进行编译的,因此遇到未在此文件中定义的函数时,只要能找到其声明,就可以将此符号放置在此编译单元的外部符号表中,并在链接时查看该符号的定义

另一方面,对于模板函数,(仅在编译器遇到使用模板函数的代码时实例化模板函数),将模板函数声明置于tem.h,将模板定义置于tem.cpp,然后main . 在这种情况下,编译器可以实例化函数的外部元件(intadd ),因为只通过声明找不到定义。 在常规函数中,此时的add函数由编译器生成了相应的代码,而模板函数此时没有生成与add函数对应的代码,但编译main.cpp时不会报告错误,链接时也不会报告错误

可以通过使用语句temmplateintadd(int,int )显式定义模板函数来实例化该函数。 编译器根据此语句生成add方法的int版本,链接不报告错误。 此外,通常这样做还会提高编译效率。 在tem.h文件中定义模板时,假设三个源文件包含头文件并正在使用模板,假设调用了add模板的int版本,则在这三个源文件中包含add模板显然效率不高。 如果如上所述显示定义模板,则仅在tem.cpp文件中实例化。

最后,模板类也遵循了上述原则。 我们知道,类的定义只是声明了类的成员函数,而编译器实际上将类的成员函数编译为重命名的全局函数。 使用类模板时,首先实例化类,同时实例化与类对应的构造函数。 只有在使用类模板的实例调用相应的模板成员函数时,才会实例化该函数。 如果类的模板成员函数定义不在与类定义相同的编译单元中(分离编译),则调用成员函数时会发生未定义的错误。 明确调用没有问题。

总结:编译器遇到使用模板函数的地方会实例化相应的函数,在此编译单元中必须有模板函数的定义才能成功实例化。 因此,模板函数的声明和定义通常位于同一文件中,以确保在使用模板的位置成功实例化。 另外,编译器保证只生成一种类型的实例化版本,不必担心重复实例化。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。