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

时间:2017-02-14 14:41:14

标签: c++ c++11 templates specialization typename

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

可以在帖子中看到MWE下降。

首先,我很惊讶B的两个专业可以一起存在。我添加了第二个来显示问题。如果删除,代码看不到适当的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

1 个答案:

答案 0 :(得分:1)

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

想象一下,你使用比方说B.你似乎期望编译器实例化A&gt;对于每种可能的类型T,希望可能存在一个恰好具有成员typedef int Titem的特化(或证明没有这样的)。或者参与定理证明练习以证明,利用A的当前可见定义和特化,没有可能的T可能导致A&lt; X&gt; :: Titem是一个int。编译器不会达到这样的长度;它反而将T声明为不可导入的上下文,并且从不使用此专业化。