具有多个参数的部分类模板特化

时间:2012-10-08 17:55:34

标签: c++ templates

我有一个模板类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: error: wrong number of template arguments (1, should be 2)
test.cpp:2:45: error: provided for ‘template class Bar’
test.cpp: In function ‘int main()’:
test.cpp:7:18: error: wrong number of template arguments (1, should be 2)
test.cpp:2:45: error: provided for ‘template class Bar’
test.cpp:7:23: error: invalid type in declaration before ‘;’ token

我特别困惑,因为这个部分专业化的习惯用法适用于单个模板参数;请参阅标题为total class specialization for a template

的问题

编辑我意识到,至少就我的目的而言,我可以使用C ++ 11可变参数模板解决这个问题,如下所示。我仍然想知道为什么第二个例子不起作用。

template <typename... FooTypes> class Bar;
template <typename... FooTypes> class Bar< Foo<FooTypes...> > { };

2 个答案:

答案 0 :(得分:3)

您的类模板Bar<T, U>有两个模板参数,但您的专业化只有一个:

template <typename T, typename U> class Bar<Foo<T, U> > {};

您的意思是Bar只接受一个模板参数并相应地对其进行专门化吗?

template <typename T> class Bar;
template <typename T, typename U> class Bar<Foo<T, U> > {};

请注意,专门化可能取决于不同数量的模板参数,但专业化需要获得相同数量的参数。它也可以反过来:完全专业化可以没有模板参数:

template <> class Bar<int> {};

答案 1 :(得分:2)

我对你在这一行中要做的事情感到有些困惑:

template <typename T, typename U> class Bar< Foo<T, U> > { }; // specialization

您说明模板需要两种类型,T和U作为类型参数。 Foo本身只是一种类型,通过使用这两个参数实例化Foo模板而创建的类型。

我知道你希望它能够在两个地方都使用它们来接收和确定T和U,但这并不能避免你只为两种类型的模板特化提供了一个类型参数。