类型和类型别名也可以作为类的成员。比如:
template<typename T>
class Tree{
using value_type = T; //成员别名
enum Policy(rb, splay, treeps); //成员枚举
class Node{
Node *right;
Node *left;
value_type value;
public:
void f(Tree *);
};
Node * top;
public:
void g(const T&);
};
成员类(也叫做嵌套类)可以引用其所属类的类型和static成员。当给定所属类一个对象时,只能引用非static成员。
嵌套类可以方位所属类的成员(甚至是非static成员,这方面与成员函数类似),但它没有当前类对象的概念。比如:
template<typename T>
void Tree::Node::f(Tree * p){
top = right; //错误:未指定类型为Tree的对象
p->top = right; //ok
value_type v = left->value; //正确,value_type 不与某个对象关联
}
相反,一个类并没有任何特殊权限能访问嵌入类的成员:
template<typename T>
void Tree::g(const T&){
value_type val = right->value; //错误,没有Tree::Node类型的对象
value_type v = p->right->value; //错误,Node::right是私有的
p->f(this); //正确
}
成员类更多的是提供了一种符号表示上的便利,而非一种重要的语言特性。另一方面,成员别名非常重要,它是依赖于关联类型的泛型编程技术的基础。成员enum通常要用enum class替代,以避免与外围作用域中和枚举值同名的实体产生冲突