相关疑难解决方法(0)

可变参数模板模板参数可以是部分专用的吗?

考虑以下程序:

template<template<typename ...> class>
struct foo {};

template<template<typename> class C>
struct foo<C> {};

int main() {}
Run Code Online (Sandbox Code Playgroud)

Clang拒绝了它的错误:

类模板部分特化不会专门化任何模板参数

即使在最新的clang 7.0 HEAD中,请参见此处的演示.但是,gcc接受了它.

请参阅[temp.class.spec],其中陈述了部分特化的规则,我找不到任何禁止该模板的部分特化的东西.特别是,专业化确实更专业,错误消息看起来不正确.

编辑:

但是,gcc的行为也是异常的,请考虑以下程序:

#include <iostream>

template<template<typename ...> class>
struct foo { void show() { std::cout << "Primary.\n"; } };

template<template<typename> class C>
struct foo<C> { void show() { std::cout << "Specialized.\n"; } };

template<class...> struct bar {};

int main() {
    foo<bar> f;
    f.show();
}
Run Code Online (Sandbox Code Playgroud)

事实证明,gcc在这种情况下使用专用版本,请参见此处.

现在我想问:

  • 是标准允许的这种局部专业化吗?

  • 哪个编译器是正确的?(一个/全部/没有?)

c++ templates clang template-specialization language-lawyer

17
推荐指数
1
解决办法
575
查看次数