3

考虑以下代码:

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 很好地编译了这段代码,并在这两种情况下都选择了第二个特化。对我来说,这些专业是相同的。第一手的第二专业有多合法?

只是好奇,对此有什么想法吗?

4

1 回答 1

4

第二个部分专业化是合法的,并且与第一个不同。

第二个部分特化没有在其模板实参列表中列出第二个模板形参的实参,因此使用 的默认实参int*,因此它等价于:

template <class x>
struct CoreTemplate<x*, int*> { ... };

对于第一个模板参数是指针类型而第二个模板参数是int*.

这比第一个部分特化更特化,当第一个模板参数是指针类型并且第二个模板参数是 int*.

在您的程序中,两者都qq1用作qq2第二int*个模板参数(显式或使用默认参数),因此两者都选择第二个实例化。

于 2012-06-22T00:53:18.983 回答