今天遇到个有趣的东西,具体代码如下
#include <iostream>
using namespace std;
template<class T>
class A
{
public:
T a;
};
template<class U>
class B
{
public:
typename U::A b1; //类模板的成员属性类型也是类模板
};
class C
{
public:
typedef int A;
};
如你所见,第15行代码就是这么奇葩,不过更奇葩的还在后面。
请问你要怎么创建一个B类型对象呢?
这就涉及到一些问题了。
第15行代码 typename U::A b1; 在这里,B的成员属性b1是一个什么类型?
在这里 U::A 表示了U本身是一个A类型或者含有A类型 的类型
所以想要给B创建对象并赋值就有了下面的代码
int main()
{
B<A<int>> b;
b.b1.a = 123;
B<C> bc;
bc.b1=123;
}
上面的A<int>是A类型,
而 C中的 typedef int A;
这个语句定义了一个名为A的类型别名(typedef),它在C类中作为公共成员属性。因此,在C类外部可以使用“C::A”来引用这个类型别名,并且它等同于int类型。
bye!