首先,我很抱歉这个问题的标题,但是很难描述。
如果我想为Resolve
的所有实例化专门设计A
,下面的那两个是有效的语法?
1)
template<uint32_t I> struct A {};
template<typename> struct Resolve;
template<uint32_t I>
struct Resolve<A<I>>
{
void f() { printf("im here!\n"); }
};
2)
template<uint32_t I> struct A {};
template<typename> struct Resolve;
template<>
template<uint32_t I>
struct Resolve<A<I>>
{
void f() { printf("im here!\n"); }
};
还是template<>
是可选的? SO有两个不同的答案:here和here。
另外,请尽可能提供标准报价。
选项2)不能在MSVC上编译,但至少可以在某些版本的GCC上编译。
答案 0 :(得分:1)
这是正确的:
template <uint32_t I>
struct Resolve<A<I>>
{ };
语法template <>
用于引入显式专业化(类模板,函数模板等)(请参见[temp.spec]/3和[temp.expl.spec]/1)。但是我们正在尝试进行部分专业化。局部专业化仍然需要引入模板参数,而显式专业化则不需要。
另一方面,如果我们尝试对显式专业化的成员进行专业化,则可以使用template <>
。例如:
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