【发布时间】:2015-07-29 08:27:58
【问题描述】:
如果我定义一个接受模板参数的struct 模板Bar:
template <template <int,bool,char> class>
struct Bar {};
我可以使用struct 模板实例化它,例如Zod:
template <int,bool,char> struct Zod {};
Bar<Zod> a;
我也可以使用嵌套的struct 模板来实例化它,例如JKL:
struct GHI {
template <int,bool,char>
struct JKL {};
};
Bar <GHI::JKL> b;
为什么我不能使用嵌套的可变参数struct 模板(例如DEF)来实例化Bar?:
template <typename ...Ts>
struct ABC {
template <Ts ...>
struct DEF {};
};
Bar<ABC<int,bool,char>::DEF> c;
G++ 4.9.2 抱怨类型/值不匹配;而 Clang 3.4.2 的错误报告模板模板参数的模板参数与其对应的模板模板参数不同。
【问题讨论】:
-
在 gcc 5.1.0 或 clang 3.6.0 上也不能编译,因为它的价值。
-
@vsoftco
ABC<int,bool,char>::DEF<4,true,'c'> foo;工作。 -
棘手的部分是
DEF实际上采用了非类型模板参数包。请参阅 [temp.param]/p15 中的示例。 -
@Barry 我的意思是
DEF在技术上是通过非类型参数包参数化的。并且带有包的模板模板参数与不带包的模板模板参数不匹配。 -
@AndyProwl 这无关紧要。它仍然是一个参数包,这就是 §14.3.3/3 不允许匹配的原因。
标签: c++ templates c++11 variadic-templates