请考虑以下代码:
template <class x1, class x2 = int*>
struct CoreTemplate { };
template <class x1, class x2>
struct CoreTemplate<x1*, x2*> { int spec; CoreTemplate() { spec = 1; } };
template <class x>
struct CoreTemplate<x*> { int spec; CoreTemplate() { spec = 3; } };
int main(int argc, char* argv[])
{
CoreTemplate<int*, int*> qq1;
printf("var=%d.\r\n", qq1.spec);
CoreTemplate<int*> qq2;
printf("var=%d.\r\n", qq2.spec);
}
MSVC编译此代码并在两种情况下选择第二个特化。对我来说,这些专业是完全相同的。第二手专业化的合法性如何?
好奇,有什么想法吗?
答案 0 :(得分:4)
第二部分专业化是合法的,与第一部分不同。
第二个部分特化不会在其模板参数列表中列出第二个模板参数的参数,因此使用默认参数int*
,因此它等效于:
template <class x>
struct CoreTemplate<x*, int*> { ... };
将为第一个模板参数为指针类型且第二个模板参数为int*
的任何实例化选择哪个。
这比第一个部分特化更专业,第一个部分特化将在第一个模板参数是指针类型时使用,第二个模板参数是任何指针类型,除了 int*
。< / p>
在你的程序中,qq1
和qq2
都使用int*
作为第二个模板参数(显式或使用默认参数),因此两者都选择第二个实例化。