在写嵌套类的代码的时候偶然发现嵌套类对象使用一般的方法无法完成初始化的情况,经过网上查找资料和大佬指点,现已解决该问题。
首先解释嵌套类是什么?一个类可以定义在另一个类里面,那么这个定义在另一个类内的类就叫做嵌套类。嵌套类的对象在另一个类中作为成员存在,定义在类内的模板类也是同理。
接下来看出问题的代码:
#include <iostream>
using namespace std;
template<class T1, class T2>
class A
{
public:
T1 A_a;
T2 A_b;
A(const T1 x,const T2 y):A_a(x),A_b(y){}
void show() { cout << A_a << A_b << endl; }
template<class T3>
class B//定义成员类模板
{
public:
T3 B_a;
B(const T3 x):B_a(x){}
void show() { cout << B_a << endl; }
};
B<string> bb("错误"); //一般的初始化方法
};
int main()
{
A<string, string> a("你好","CSDN");
a.bb.show();//出错
}
编译器出错提示:
以平常的编程习惯去看,代码看似没有问题,但是程序却出错了,问题就在于类内使用()会被当作函数,也就是说编译器将我们创建的嵌套类对象当成了函数。将嵌套类对象初始化的()改成{}即可解决问题,下面是修正后的代码:
#include <iostream>
using namespace std;
template<class T1, class T2>
class A
{
public:
T1 A_a;
T2 A_b;
A(const T1 x,const T2 y):A_a(x),A_b(y){}
void show() { cout << A_a << A_b << endl; }
template<class T3>
class B//定义成员类模板
{
public:
T3 B_a;
B(const T3 x):B_a(x){}
void show() { cout << B_a << endl; }
};
B<string> bb{"错误"}; //修改后的初始化方法
};
int main()
{
A<string, string> a("你好","CSDN");
a.bb.show();//正常运行
}
还有另一种令程序正常运行的方法:取消初始化,手工赋值也能避免这种错误的发生。
#include <iostream>
using namespace std;
template<class T1, class T2>
class A
{
public:
T1 A_a;
T2 A_b;
A(const T1 x,const T2 y):A_a(x),A_b(y){}
void show() { cout << A_a << A_b << endl; }
template<class T3>
class B//定义成员类模板
{
public:
T3 B_a;
B(){}//不进行初始化
void show() { cout << B_a << endl; }
};
B<string> bb{"错误"};
};
int main()
{
A<string, string> a("你好","CSDN");
a.bb.B_a="手工赋值"
a.bb.show();//正常运行
}
第一次写文章,不足之处有请指点,这个问题不是很难,但是是我写代码时真实遇到的,希望可以帮到遇到相同疑惑的朋友,也作自我提醒之用。