这个问题由两部分组成,标记为(A)到...... ahem ......(C)。
template< unsigned a > struct Outer {
/*
(A) Provide a match if the template parameter of Inner is the same
as Outer. Do something different in the general case (not shown)
*/
template< unsigned b > struct Inner1;
template<> struct Inner1<a> { enum { value = a }; };
/*
(B) Same idea as (A), but we want an additional template parameter
*/
template< typename T, unsigned b > struct Inner2;
template< typename T > struct Inner2< T, a > { enum { value = a }; };
typedef Inner1<a> Result1;
typedef Inner2<int, a> Result2;
};
// (C) Alternative way of defining our specializations?
template< unsigned a > template<>
struct Outer<a>::template Inner1<a> {};
template< unsigned a > template< typename T >
struct Outer<a>::template Inner2<T, a> {};
void code() {
Outer<1>::Result1::value; // OK,
Outer<1>::Result2::value; // error C2027: use of undefined type 'Outer<1>::Inner2<int,1>'
}
使用Visual Studio 2013或2015,没有语言扩展,(A)和(B)编译成功。 (C)使用fatal error C1001: An internal error has occurred in the compiler.
(A)Result1被正确选为专用模板
(B)结果2不是,导致使用未定义类型&#39;。
但我已经读过,专门化一个嵌套在类模板中的类模板是不行的。为什么它在这里工作?如果我想提供这种行为(匹配外部模板参数)有哪些更好的方法?
答案 0 :(得分:0)
这是一种完成案例(B)的方法。
template< typename T, unsigned b, unsigned a > struct Inner;
template< typename T, unsigned a >
struct Inner< T, a, a > { enum { value = a }; };
template< unsigned a > struct Outer {
typedef Inner<int, a, a> Result;
};
void code() {
Outer<1>::Result::value; // OK,
}
唯一的限制是Inner不能再位于原始类的私有部分中(例如,如果它是Outer的实现细节,则应该具有受限制的访问权限。)