C++ 类模板专门化中模板参数的默认值

C++ 类模板专门化中模板参数的默认值,c++,templates,visual-c++,template-specialization,C++,Templates,Visual C++,Template Specialization,考虑以下代码: 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*> {

考虑以下代码:

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);
}
模板
结构核心模板{};
模板
结构CoreTemplate{int spec;CoreTemplate(){spec=1;}};
模板
结构CoreTemplate{int spec;CoreTemplate(){spec=3;}};
int main(int argc,char*argv[])
{
核心模板qq1;
printf(“var=%d.\r\n”,qq1.spec);
核心模板qq2;
printf(“var=%d.\r\n”,qq2.spec);
}
MSVC很好地编译了这段代码,并在这两种情况下都选择了第二个专门化。对我来说,这些专业是相同的。第二种专业化在第一方面有多合法


好奇的是,你对此有何想法?

第二个部分专门化是合法的,与第一个不同


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

template <class x>
struct CoreTemplate<x*, int*> { ... };
模板
结构核心模板{…};
对于第一个模板参数为指针类型,第二个模板参数为
int*
的任何实例化,都将选择该参数

这比第一个部分专门化更专业,当第一个模板参数是指针类型,第二个模板参数是除
int*
以外的任何指针类型时,将使用第一个部分专门化


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

感谢您的评论。合理的建议。