CPP Templates 之 ADL应用举例

ADL应用举例:

1.友元名称插入:

在类中的友元函数声明可以是该友元函数的首次声明,请参见
下面的例子:

template<typename T>
class C{
    ...
    friend void f();
    friend void f(C<T> const&);
};

void g(C<int>* p)
{
    f();//error
    f(*p);//ok
}

通常而言,友元声明在外围(类)作用域中是不可见的
如果友元函数所在的类属于ADL的关联类集合,那么我们这个
外围类是可以找到该友元声明的。

2.插入式类名称

如果在类本身的作用域中插入该类的名称,我们就称该名称为
插入式类名称。它可以被看做该类作用域中的一个非受限名称
而且是可访问的名称。
例如:

#include <iostream>

int C;

class C{
private:
    int i[2];
public:
    static int f()
    {
        return sizeof(C);
    }
};

类模板也可以具有插入式类名称,他们的而后面可以紧跟模板
实参,如果没有紧跟模板实参,那么他们代表的就是用参数来
代表实参的类,例如:

template<template<typename T> class TT> class X
{};

template <typename T> class C
{
    C* a;//正确,等价于C<T> *a;
    C<void> b;//正确
    X<C> c;//error
    X<::C> d;//error
    X< ::C> e;//ok
}

你可能感兴趣的:(template)