【问题标题】:Default values of template parameters in the class template specializations类模板特化中模板参数的默认值
【发布时间】:2012-06-22 00:46:20
【问题描述】:

考虑以下代码:

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

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

【问题讨论】:

    标签: c++ templates visual-c++ template-specialization


    【解决方案1】:

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

    第二个偏特化并没有在其模板实参列表中列出第二个模板形参的实参,所以使用int*的默认实参,所以它等价于:

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

    对于第一个模板参数是指针类型且第二个模板参数是int* 的任何实例化,都会选择哪个。

    这比第一个部分特化更特化,它将在第一个模板参数是指针类型并且第二个模板参数是任何指针类型时使用除了int*。

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

    【讨论】:

    • 感谢您的评论。合理的建议。
    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多