在类模板特化的模板参数的默认值(Default values of template paramet

2019-09-18 08:58发布

考虑下面的代码:

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编译该代码细,并且选择在两种情况下,第二个特。 对我来说,这两个特是相同的。 如何法律是于第一手第二专业化?

只是好奇,这个有什么想法?

Answer 1:

第二部分特是合法的,并且是不相同的第一个。

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

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

这将被选择用于任何实例化,其中所述第一模板参数是一个指向型和第二个模板参数是int*

比所述第一部分特,当第一模板参数是一个指向型和第二个模板参数是除了任何指针类型将被用于更专门int*

在你的程序都qq1qq2使用int*作为第二个模板参数(显式或使用默认参数),所以都选择第二个实例。



文章来源: Default values of template parameters in the class template specializations