考虑到这种代码:C++函数模板特殊化和重载
template <class T>
void f(T p) { //(1)
cout << "Second" << endl;
}
template <>
void f(int *p) { //(2)
cout << "Third" << endl;
}
template <class T>
void f(T* p) { //(3)
cout << "First" << endl;
}
呼叫如int *p; f(p);
将输出First
。
如果声明的顺序改变时,这样的:
template <class T>
void f(T* p) { //(3)
cout << "First" << endl;
}
template <class T>
void f(T p) { //(1)
cout << "Second" << endl;
}
template <>
void f(int *p) { //(2)
cout << "Third" << endl;
}
相同的呼叫(int *p; f(p);
)将输出Third
。
我读到其中函数模板重载需要的地方的方式:第一分辨率只考虑非模板功能和底层的基本模板。在选择“最专业化”之后,如果它是一个模板函数,并且对推导(或明确指定)的参数具有专门化,则调用该专业化。
现在我的问题是:如何确定哪个底层基模板的某个功能是专门化的?在我的例子中,哪个函数模板过载((1)或(3))是(2)专业化?
我的猜测是,当声明专业化时,已经声明了模板,并从那些最“专业的”(其参数与这个专业化“最接近”)被选择。它是否正确?另外,您能否指出我在标准中指定的位置?
因此,从专业化之前声明的模板函数中,使用偏序排序来选择“正确的一个”? – user42768
@ user42768 - 通过模板参数推导*和*部分排序,是的。 – StoryTeller