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
我猜这是违反了一个定义规则,编译器只是“挑选了一个”来执行,但我对这个评估并不完全确定。 –
由于不能推导出“T”,因此第一个不能使用。在更近的时候,[导致程序不合格](https://timsong-cpp.github.io/cppwp/temp.class.spec#match-3)。 –
我认为它不需要第一个专门化,因为它不能解决T的类型。gcc给了我一个编译你的代码的错误消息:模板参数在部分专业化中不能被推导。如果我明确指定模板中使用的类型(int而不是T),它很有效,显然不是你想要的。 – Klaus