浅析c++中函数调用其他文件中的模板函数出错

报错信息

Undefined symbols for architecture x86_64:
  "void PrintNum<int>(int)", referenced from:
      _main in main-d2a7a9.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

错误描述

在如下图所示的文件中展现的调用关系,在一个.cc(main.cc)文件中调用另一个.cc(test.cc)文件中的模板函数,编译过程出错。

	// test.cc
	template<typename T>
	 void function(T a) { ... }
	//test.h
	template<typename T>
	void function(T a);
	
	//main.cc
	int main() {
	  int a=0;
	  function(a);
	} 

原因分析

c++从代码到可执行文件,经历了编译和连接两大步骤。在第一个步骤中,编译是指将一个个cpp文件及其include的.h头文件编译成一个个***文件,一个cpp及其include的头文件表示一个编译单元。当编译器将一个工程中的所有的cpp文件以分离的方式编译完毕后,再由连接器进行连接构成一个可执行文件。
按照上面的描述,上述出错的原因就很明显了

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值