我有一个模板类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...> > { };
答案 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,但这并不能避免你只为两种类型的模板特化提供了一个类型参数。