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
}
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
}