【发布时间】:2012-09-29 00:18:39
【问题描述】:
我有一个模板类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:错误:';' 标记之前的声明类型无效
我特别困惑,因为这种偏特化习语适用于单个模板参数;请参阅标题为:total class specialization for a template
的问题编辑我意识到,至少就我的目的而言,我可以使用 C++11 可变参数模板来解决这个问题,如下所示。不过,我仍然想知道为什么第二个示例不起作用。
template <typename... FooTypes> class Bar;
template <typename... FooTypes> class Bar< Foo<FooTypes...> > { };
【问题讨论】:
-
那么,有什么问题?模板类 Bar 有 1 个参数,但 Bar 应该有 2 个参数。此外,您不知道部分模板规范化的语法。阅读一些关于 C++ 的基础书籍。
-
目前还不清楚您要在这里实现什么。我认为您需要回答基本问题:Bar 的功能是由 Foo 参数化的,还是由 T 和 U 的选择参数化的?如果是前者,您是否考虑过“template
class Bar”,您可能会将 Foo 作为 F 传递?在后一种情况下,您是否只是为了方便而尝试从 Foo 中提取 T 和 U ?此页面也可能有用:cprogramming.com/tutorial/template_specialization.html