这是ISO C++标准14.6.4.1实例化的声明
对于函数模板特化,成员函数模板特化,或成员函数或类模板的静态数据成员的特化,如果特化是隐式实例化的,因为它是从另一个模板特化和其中的上下文中引用的引用依赖于模板参数,专门化的实例化点是封闭专门化的实例化点.否则,这种特化的实例化点紧跟在引用特化的命名空间范围声明或定义之后.
如果以使用该函数模板或成员函数的默认参数的定义的方式调用类模板的函数模板或成员函数,则默认参数的实例化点是函数模板的实例化点或成员职能专业化.
对于类模板特化,类成员模板特化或类模板的类成员的特化,如果特化是隐式实例化的,因为它是从另一个模板特化中引用的,如果引用特化的上下文取决于在模板参数上,如果在
封闭模板的实例化之前未实例化特化,则实例化的点紧接在封闭模板的实例化之前.否则,这种特
化的实例化点紧接在引用特化的命名空间范围声明或定义之前.
我无法为整个部分编写程序.我试图从昨天开始编写本节目的程序.
任何人都可以为我提供一些代码供这些部分理解.
请,通常..我试着问一个或多个积分.在任何部分.但是这里我无法理解本节中的一点.
所以,任何人都可以为我提供一个代码(程序)供本部分理解.
我发现这非常令人头疼,委员会也有这么多的乐趣.所以我认为我可能在下面有一些错误.所以请仔细阅读:)
第三段
对于类模板特化,类成员模板特化或类模板的类成员的特化,如果特化是隐式实例化的,因为它是从另一个模板特化中引用的,如果引用特化的上下文取决于在模板参数上,如果在封闭模板的实例化之前未实例化特化,则实例化的点紧接在封闭模板的实例化之前.
换句话说,如果实例化类模板或类模板的嵌套类,并且导致该实例化的上下文依赖于模板参数,则模板/嵌套类在实例化模板的实例化之前立即实例化它.
在其它专门的上下文可以依赖于模板的参数,这是主模板,偏特和类模板的成员的情况下,或它不依赖于模板的参数,其是用于从明确的特化中的引用的情况.
否则[即上下文是非依赖的],这种特化的实例化点紧接在引用特化的命名空间范围声明或定义之前.
这种区别很重要.考虑如果从依赖上下文的特化实例化将立即在命名空间范围声明或引用它的定义之前会发生什么
template<typename T, int N>
struct A {
typedef typename A<T, N-1>::type *type;
};
template<typename T>
struct A<T, 0> {
typedef T type;
};
typedef A<int, 2>::type ptr;
Run Code Online (Sandbox Code Playgroud)
该模板应该添加N指针声明符.例如,也A<int, 2>就是这样int**.
typedef A<int, 2>::type是非依赖的,因此A<int, 2>在typedef声明之前进行实例化.在内部 A<int, 2>,我们有A<int, N-1>::type,它出现在一个依赖的上下文中,并引用A<int, 1>::type.所以标准要求我们在实例化A<int, 1>的同一点进行实例化A<int, 2>.
如果我们将是交给它(主模板定义之前)的命名空间范围内声明之前立即实例化这一点,我们就不会注意到局部特殊化A<T, 0>处理,当`A<int, N-1>::type内A<int, 1>,因为我们将实例化A<int, 1> 之前是专业化.
第二段
这样,在默认参数中查找的名称与在其所用函数的其余部分中查找的名称一致(即,它们的POI与其函数模板的POI /类模板的成员函数相同).
第一段
这基本上与第三段相同.但是,函数模板在引用它们的实体之后被实例化,以便可以进行递归使用,如下例所示.相反,类模板在引用它们的实体之前被实例化,因为实体要求类类型完整.如果类类型的POI将在该实体之后,则类类型仍然不存在.
template<typename T>
void f(T);
template<typename T>
struct A {
void g() {
f(0);
}
void h() { /* do a dance */ }
};
template<typename T>
void f(T t) {
A<T> a;
a.h();
}
void g() {
A<int> a;
a.g();
}
Run Code Online (Sandbox Code Playgroud)
如果之前f会被实例化,那么它就无法访问,因为那时它还不存在.因此,函数模板在引用它们的实体之后被实例化,并且类模板在引用它们的实体之前被实例化. A<int>a.h()
| 归档时间: |
|
| 查看次数: |
731 次 |
| 最近记录: |