2017-02-14 61 views
0

我想要使用在另一个结构A内定义的类型来专用结构B.可以在帖子中看到MWE向下。使用typename的模板结构专用化::

首先我很惊讶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(); 
} 

输出: “富2” 使用Xcode的7

+0

我猜这是违反了一个定义规则,编译器只是“挑选了一个”来执行,但我对这个评估并不完全确定。 –

+1

由于不能推导出“T”,因此第一个不能使用。在更近的时候,[导致程序不合格](https://timsong-cpp.github.io/cppwp/temp.class.spec#match-3)。 –

+1

我认为它不需要第一个专门化,因为它不能解决T的类型。gcc给了我一个编译你的代码的错误消息:模板参数在部分专业化中不能被推导。如果我明确指定模板中使用的类型(int而不是T),它很有效,显然不是你想要的。 – Klaus

回答

0

问题的答案在评论中给出。谢谢。