使用 typename 的模板结构专业化 ::

Template structure specialization using typename ::

我想用在另一个结构 A 中定义的类型来专门化结构 B。

可以在 post.

中看到一个 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();
}

输出:"foo 2" 使用 Xcode 7

Igor Tandetnik 在评论中给出的答案:

假设您使用 B。您似乎希望编译器为每个可能的类型 T 实例化 A>,希望可能存在恰好具有成员 typedef int Titem(或来证明有none这样的)。或者参与定理证明练习以证明,根据 A 的当前可见定义和特化,没有可能的 T 可能导致 A< X >::Titem 为 int。编译器不会走这么远;它改为将 T 声明为不可推导的上下文,并且从不使用此特化。