调用addHistograms_temp模板函数传入TH2报undefined reference错如何解决
错误原因分析
这是C++模板分离编译导致的典型链接错误,具体触发逻辑如下:
- 你将
addHistograms_temp模板函数的声明放在头文件、实现放在独立的.cpp源文件中。C++标准要求模板函数被调用时,编译器需要看到完整实现代码才能实例化对应类型的版本,如果实现对调用方不可见,就不会生成对应实例的二进制代码。 - TH1版本可以正常链接,是因为模板实现所在的.cpp文件中,要么已经显式实例化了TH1版本的模板,要么该.cpp内有调用TH1版本模板的代码,编译器编译该.cpp时已经生成了TH1版本的实例符号。而TH2版本没有对应的实例化逻辑,因此链接阶段找不到对应的符号。
解决方案
你可以选择以下任意一种方案解决问题:
- 【通用推荐方案】将模板函数的完整实现代码移动到声明所在的头文件中,所有调用该模板的代码都可以直接看到实现,在调用点自动实例化对应类型的版本。
- 【有限类型调用场景方案】如果你确定模板只会被有限个类型调用,可以保留声明和实现分离的结构,在模板实现所在的.cpp文件末尾,添加TH2版本的显式实例化语句:
template TH2* addHistograms_temp<TH2>(const std::string & newHistogramName, const std::vector<TH2 *> & histogramsToAdd, int verbosity);
内容的提问来源于stack exchange,提问作者user121424
相关产品推荐
相关产品推荐

