我有一个模板类Foo
,它接受两个(或更多)模板参数。我想在单独的类中使用它的类型Bar
。请参阅以下简单示例,该示例编译时没有错误:
template <typename T, typename U> class Foo { };
template <typename T, typename U> class Bar { };
int main()
{
Bar<int, char> bar; // quick example -- int & char could be any 2 types
return 0;
}
上面的内容有点乏味,特别是如果Foo
需要许多模板参数并且程序员必须重新输入它们。我想要类似下面的东西,但它不能编译:
template <typename T, typename U> class Foo { };
template <typename T, typename U> class Bar; // base
template <typename T, typename U> class Bar< Foo<T, U> > { }; // specialization
int main()
{
typedef Foo<int, char> FooType;
Bar<FooType> bar;
return 0;
}
test.cpp:3:60:错误:模板参数的数量错误(1,应该是 2) test.cpp:2:45:错误:为“模板类 Bar”提供 test.cpp:在函数'int main()'中: test.cpp:7:18:错误:模板参数的数量错误(1,应该是 2) test.cpp:2:45:错误:为“模板类 Bar”提供 test.cpp:7:23:错误:';'之前的声明中的类型无效 令牌
我特别困惑,因为这种偏特化习语适用于单个模板参数;请参阅标题为:模板的总类专业化的问题
编辑我意识到,至少出于我的目的,我可以使用 C++11 可变参数模板来解决这个问题,如下所示。不过,我仍然想知道为什么第二个示例不起作用。
template <typename... FooTypes> class Bar;
template <typename... FooTypes> class Bar< Foo<FooTypes...> > { };