C++模板类实例化时为何要求模板参数类型提供无参构造函数
问题原因
C++类的成员变量初始化阶段早于构造函数体执行:如果没有在构造函数的成员初始化列表中显式初始化IntBox<T>的data成员,编译器会自动为data调用模板参数T的无参构造函数完成默认初始化,这一步逻辑和构造函数体内是否有代码完全无关。
你所写的IntBox构造函数:
IntBox(const T& t) { }
实际等价于编译器隐式补充了默认初始化逻辑:
IntBox(const T& t) : data() // 此处隐式调用T的无参构造函数 { }
由于你注释掉了Int类的无参构造函数,编译阶段无法找到匹配的构造函数,就会抛出你所看到的报错。
修复方法
在构造函数的成员初始化列表中,显式用入参t初始化data成员即可,不需要为Int补充无参构造:
IntBox(const T& t) : data(t) // 显式调用Int的拷贝构造函数完成初始化 { }
修改后即可正常编译运行。
内容的提问来源于stack exchange,提问作者Wenling Liu
相关产品推荐
相关产品推荐

