C++模板类存储未知类型成员变量编译错误求助
嘿,来解决你的C++模板类初始化问题~
首先,咱们直接揪出问题的根源:你的Derived模板类构造函数里犯了一个容易踩的小坑!
先看你写的构造函数代码:
Derived(T c) { T m_c = c; }
这里的T m_c = c;是在构造函数内部重新定义了一个局部变量m_c,完全没碰类的成员变量m_c!
因为成员变量m_c没有被显式初始化,编译器会自动尝试调用T的默认构造函数(就是不带参数的构造函数)来初始化它,但你的Base和Base2都只定义了带string参数的构造函数,没有默认构造函数,这就导致了编译报错:no matching function for call to ‘Base::Base()’。
修正后的模板类代码
给你两种靠谱的修正方式,推荐第一种:
方式1:用构造函数初始化列表(最优解)
这是C++初始化成员变量的标准最佳实践,效率更高,逻辑更清晰:
template <typename T> class Derived { public: T m_c; // 用初始化列表直接初始化成员变量,跳过默认构造函数的尝试 Derived(T c) : m_c(c) {} void print() { m_c.print(); } };
方式2:构造函数体内直接赋值(能解决问题,但不推荐)
如果你更习惯在函数体内写逻辑,只要去掉局部变量的定义,直接给成员变量赋值就行:
template <typename T> class Derived { public: T m_c; // 不再定义新的局部m_c,直接给类的成员变量赋值 Derived(T c) { m_c = c; } void print() { m_c.print(); } };
为啥模板函数能正常运行?
你的模板函数print(T c)是直接接收参数的拷贝,函数内部用这个拷贝好的对象调用print()——整个过程是通过拷贝构造函数直接初始化参数c,完全不需要调用T的默认构造函数,所以不会触发报错,和模板类的成员变量初始化逻辑完全不同。
验证一下
修正后,你的测试代码就能正常编译运行,输出结果会是:
Hello b1 Hey b2
内容的提问来源于stack exchange,提问作者Ougelthorn
相关产品推荐
相关产品推荐

