如何解决C++中类模板实例化时的构造函数未定义引用报错
问题产生原因
这个报错是C++类模板开发中的典型链接错误,触发逻辑非常直接:
- 你在类定义中仅对构造函数
Yonah(T a, T b)做了声明,全程没有编写这个构造函数对应的实现代码。编译到main函数里创建Yonah<int>对象的位置时,会调用这个构造函数,但链接阶段找不到匹配的函数实体,就会抛出未定义引用的报错。 - 你已经实现的
larger()成员函数没有触发报错,本质是C++模板遵循特殊的编译规则:模板的所有成员(构造函数、普通成员函数)的实现代码,必须和类声明处于同一个可被实例化的翻译单元中。和普通类不同,模板不能做“声明在头文件、实现在独立cpp文件”的分离编译——编译到实例化Yonah<int>的位置时,编译器需要拿到完整的模板实现,才能现场生成对应int类型版本的构造函数、成员函数代码;如果实现被拆分到其他源文件,哪怕你补了构造函数的代码,依然会触发同款未定义引用报错。
对应解决步骤
- 按照模板成员的定义语法,补上缺失的构造函数实现,和现有
larger()成员函数的编写格式保持一致。 - 所有模板成员的实现都要放在类定义的紧邻位置,不要拆分到独立的源文件中,保证编译阶段能拿到完整的模板代码,顺利为
Yonah<int>生成对应的可调用函数实体。
修正后的可运行代码
#include <iostream> using namespace std; template<class T> class Yonah { T first, second; public: Yonah(T a, T b); T larger(); } ; // 补上缺失的构造函数模板实现 template<class T> Yonah<T>::Yonah(T a, T b) : first(a), second(b) {} template<class T> T Yonah<T>::larger() { return(first>second?first:second); } int main() { Yonah <int> obj(4,5); cout<<"Larger = "<<obj.larger(); return 0; }
内容的提问来源于stack exchange,提问作者YONAH GRAPHICS
相关产品推荐
相关产品推荐

