给出以下代码
template<typename T>
struct A{
struct In{};
};
template<typename T>
struct Desc{
};
template<typename X>
struct Desc<typename A<X>::In> {
};
int main(){
Desc<A<int>::In> a;
}
编译器拒绝 DES 特化
error: template parameters not used in partial specialization:
error: ‘X’
如果结构体是由以下定义的,则相同
template<>
template<typename X>
struct Desc<typename A<X>::In> {
};
定义
template<typename X>
template<>
struct Desc<typename A<X>::In> {
};
报错
desc.cpp:14:10: error: invalid explicit specialization before ‘>’ token
desc.cpp:14:10: error: enclosing class templates are not explicitly specialized
desc.cpp:15:8: error: template parameters not used in partial specialization:
desc.cpp:15:8: error: ‘X’
这是像这里一样的“非推导上下文”的情况吗?
Template parameters not used in partial specialization
这是有道理的,因为不能保证内部类实际上是一个类(我们只知道它是一个类型名,它可能是一个 typedef)。 那么有没有办法指定它是一个真正的类?
最佳答案
有没有办法指定它是一个真正的类
不,如果您在部分模板特化中使用此类型,则无法指定。
只有两种方法。专业Desc
用于混凝土A
,所以,
template<>
struct Desc<typename A<type>::In> { };
或者使用类似的东西
template<typename T, typename = void>
struct Desc{
};
template<typename X>
struct Desc<X, typename A<X>::In> {
};
或者当然专门针对 A<X>
类型不适合A<X>::In
.
关于c++ - 模板类内部类的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090737/