使用 typename 的模板结构专业化 ::
Template structure specialization using typename ::
我想用在另一个结构 A 中定义的类型来专门化结构 B。
可以在 post.
中看到一个 MWE。
首先我很惊讶 B 的两个特化可以同时存在。我添加了第二个来显示问题。如果删除,代码将看不到 B 的适当特化。
我宁愿只保留第一个专业。
所以,我的问题是:
- 为什么B的两个特化可以并存?
- 为什么第一个不适用于 main 的实例化?
definitions.h :
template <class T>
class X {};
template <class T>
class Xitem {};
template <class T>
struct A;
template <class T>
struct A< X<T> > {
typedef Xitem<T> Titem;
};
template <class T>
struct B;
template <class T>//I need this one only
struct B< typename A< X<T> >::Titem > {
static void foo() {
std::cout << "foo 1" << std::endl;
}
};
template <class T>
struct B< Xitem<T> > {
static void foo() {
std::cout << "foo 2" << std::endl;
}
};
main.cpp :
#include "definitions.h"
int main(int argc, char *argv[]) {
B< A< X<int> >::Titem >::foo();
}
输出:"foo 2"
使用 Xcode 7
Igor Tandetnik 在评论中给出的答案:
假设您使用 B。您似乎希望编译器为每个可能的类型 T 实例化 A>,希望可能存在恰好具有成员 typedef int Titem(或来证明有none这样的)。或者参与定理证明练习以证明,根据 A 的当前可见定义和特化,没有可能的 T 可能导致 A< X >::Titem 为 int。编译器不会走这么远;它改为将 T 声明为不可推导的上下文,并且从不使用此特化。
我想用在另一个结构 A 中定义的类型来专门化结构 B。
可以在 post.
中看到一个 MWE。首先我很惊讶 B 的两个特化可以同时存在。我添加了第二个来显示问题。如果删除,代码将看不到 B 的适当特化。 我宁愿只保留第一个专业。
所以,我的问题是:
- 为什么B的两个特化可以并存?
- 为什么第一个不适用于 main 的实例化?
definitions.h :
template <class T>
class X {};
template <class T>
class Xitem {};
template <class T>
struct A;
template <class T>
struct A< X<T> > {
typedef Xitem<T> Titem;
};
template <class T>
struct B;
template <class T>//I need this one only
struct B< typename A< X<T> >::Titem > {
static void foo() {
std::cout << "foo 1" << std::endl;
}
};
template <class T>
struct B< Xitem<T> > {
static void foo() {
std::cout << "foo 2" << std::endl;
}
};
main.cpp :
#include "definitions.h"
int main(int argc, char *argv[]) {
B< A< X<int> >::Titem >::foo();
}
输出:"foo 2" 使用 Xcode 7
Igor Tandetnik 在评论中给出的答案:
假设您使用 B。您似乎希望编译器为每个可能的类型 T 实例化 A>,希望可能存在恰好具有成员 typedef int Titem(或来证明有none这样的)。或者参与定理证明练习以证明,根据 A 的当前可见定义和特化,没有可能的 T 可能导致 A< X >::Titem 为 int。编译器不会走这么远;它改为将 T 声明为不可推导的上下文,并且从不使用此特化。