通过模板参数具体化的类型的模板专业化

时间:2018-08-23 17:33:30

标签: c++ language-lawyer

首先,我很抱歉这个问题的标题,但是很难描述。 如果我想为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有两个不同的答案:herehere
另外,请尽可能提供标准报价。

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

1 个答案:

答案 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