模板结构专业化使用TypName ::

Template structure specialization using typename ::

本文关键字:TypName 专业化 结构      更新时间:2023-10-16

我想使用定义在另一个结构A。

中定义的类型bust b。

一个人可以在帖子中看到MWE。

首先,我感到惊讶的是B的两个专业都可以一起存在。我添加了第二个以显示问题。如果删除,代码请参见B的适当专业化。我宁愿只保留第一个专业化。

所以,我的问题是:

  • 为什么B的两个专业可以一起存在?
  • 为什么第一个不适用于Main的实例化?

defutions.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在评论中给出的答案:

想象一下您使用的。没有这样的)。否则进行定理的练习以证明,通过当前可见的定义和专业化,不可能导致A&lt;x> :: titem是一个。编译器不会达到这样的长度;相反,它声明t为不可及的上下文,从不使用此专业化。