C++ 模板参数具体化的类型的模板专门化

C++ 模板参数具体化的类型的模板专门化,c++,language-lawyer,C++,Language Lawyer,首先,我很抱歉这个问题的标题,但它很难描述。 如果我想为A的所有实例化专门化Resolve,下面哪两个是有效的语法 (一) 模板结构A{}; 模板结构解析; 样板 结构解析和。 如果可能的话,请提供标准的报价 选项2)不在MSVC上编译,但至少在某些GCC版本上编译。这是正确的: template <uint32_t I> struct Resolve<A<I>> { }; 模板 结构解析和。但我们正在尝试进行部分专业化。部分专门化仍然需要引入模板参数,而显

首先,我很抱歉这个问题的标题,但它很难描述。 如果我想为
A
的所有实例化专门化
Resolve
,下面哪两个是有效的语法 (一)

模板结构A{};
模板结构解析;
样板
结构解析和。
如果可能的话,请提供标准的报价

选项2)不在MSVC上编译,但至少在某些GCC版本上编译。

这是正确的:

template <uint32_t I>
struct Resolve<A<I>>
{ };
模板
结构解析和。但我们正在尝试进行部分专业化。部分专门化仍然需要引入模板参数,而显式专门化则不需要

另一方面,如果我们试图专门化显式专门化的成员,那么我们将使用
模板
。例如:

template <class T>
struct A {
    template <class T2> struct B { }; // #1
};

template <>         // for A
template <class T2> // for B
struct A<int>::B<T2> { }; // #2

A<char>::B<int> x; // #1
A<int>::B<char> y; // #2
模板
结构A{
模板结构B{};//#1
};
模板//用于
模板//用于B
结构A::B{};//#2.
A::bx;//#1.
A::B y;//#2.

第二篇文章的公认答案明确指出,
模板
位无效。但不幸的是,没有说明我不确定你在找什么。如果标准中没有任何东西表明它是有效的,那么它就是无效的。好吧,也许标准在某种程度上说了这种情况。如果没有,那么我会同意第一个答案是无效的
template <uint32_t I>
struct Resolve<A<I>>
{ };
template <class T>
struct A {
    template <class T2> struct B { }; // #1
};

template <>         // for A
template <class T2> // for B
struct A<int>::B<T2> { }; // #2

A<char>::B<int> x; // #1
A<int>::B<char> y; // #2