using namespace std;
template<typename T>
struct A
{
T a1;
T a2;
A(T x,T y)
{
a1=x;
a2=y;
}
/*A()
{}
};*/ //去掉这个构造函数之后,编译就无法通过,添加了才能通过编译
template<typename T>
struct B
{
//T p1,p2;
A<T> b1;
T b2;
B(T x,T y)
{
b2=x;
b1=A<T>(x,y);
}
};
int main()
{
A<char> a('c','c');
B<char> b('c','c');
cout<<a.a1<<endl<<a.a2<<endl;
cout<<b.b1.a1<<endl<<b.b1.a2<<endl;
}
如上,在定义B时,B内有类型A的数据成员b1,这时候b1应该没有初始化吧?在B的构造函数里,左值的b1难道以及默认先进行了初始化?所以才会导致编译无法通过?还是说有别的原因?
如果想要不添加A()这个空的构造函数,还能让编译通过,需要在语法上做哪些改动?谢谢!
6 个解决方案
#1
template<typename T>
struct B
{
//T p1,p2;
A<T> b1;
T b2;
B(T x,T y)
: b1(x, y)
, b2(x)
{
}
};
初始化列表啊。。。
#2
楼主,你还是找本最基本教材从头补课吧。
模板就先别玩了。莫于浮沙筑高台。
模板就先别玩了。莫于浮沙筑高台。
#3
看过一个cplusplus网站上的tutorial,基本概论稍微了解些,然后想通过实践学习,没想到细节方面的东西还真多。。。。
#4
谢谢,刚刚查了教材,是不是没有默认构造函数的类类型成员都必须显示初始化列表?
#5
A<T> b1;
这就要求A有一个无参数的初始化函数。
这就要求A有一个无参数的初始化函数。
#6
用缺省参数
A(T x = 0,T y = 0) : a1(x), a2(y) {}
#1
template<typename T>
struct B
{
//T p1,p2;
A<T> b1;
T b2;
B(T x,T y)
: b1(x, y)
, b2(x)
{
}
};
初始化列表啊。。。
#2
楼主,你还是找本最基本教材从头补课吧。
模板就先别玩了。莫于浮沙筑高台。
模板就先别玩了。莫于浮沙筑高台。
#3
看过一个cplusplus网站上的tutorial,基本概论稍微了解些,然后想通过实践学习,没想到细节方面的东西还真多。。。。
#4
谢谢,刚刚查了教材,是不是没有默认构造函数的类类型成员都必须显示初始化列表?
#5
A<T> b1;
这就要求A有一个无参数的初始化函数。
这就要求A有一个无参数的初始化函数。
#6
用缺省参数
A(T x = 0,T y = 0) : a1(x), a2(y) {}