我想使用在另一个结构A中定义的类型来专门化struct B.
可以在帖子中看到MWE下降。
首先,我很惊讶B的两个专业可以一起存在。我添加了第二个来显示问题。如果删除,代码看不到适当的B专业化。 我宁愿只保留第一个专业。
所以,我的问题是:
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();
}
输出:&#34; foo 2&#34; 使用Xcode 7
答案 0 :(得分:1)
Igor Tandetnik在评论中给出的答案:
想象一下,你使用比方说B.你似乎期望编译器实例化A&gt;对于每种可能的类型T,希望可能存在一个恰好具有成员typedef int Titem的特化(或证明没有这样的)。或者参与定理证明练习以证明,利用A的当前可见定义和特化,没有可能的T可能导致A&lt; X&gt; :: Titem是一个int。编译器不会达到这样的长度;它反而将T声明为不可导入的上下文,并且从不使用此专业化。