2

给出以下代码

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;
}

编译器拒绝 Desc 专业化

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 ‘&gt;’ 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’

这是“非推断上下文”的情况吗?

部分特化中未使用的模板参数

这是有道理的,因为不能保证内部类实际上是一个类(我们只知道它是一个类型名,它可能是一个类型定义)。那么有没有办法指定它是一个真正的类?

4

1 回答 1

2

那么有没有办法指定它是一个真正的类

不,如果您在部分模板专业化中使用此类型,则无法指定。

只有两种方法。专门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.

于 2012-08-23T11:59:14.393 回答