1

我有一个模板类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...> > { };
4

2 回答 2

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> {};
于 2012-10-08T18:11:45.817 回答
2

我对您在此行中尝试执行的操作感到有些困惑:

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

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

我看到您期望它能够拾取并确定 T 和 U,因为您在这两个地方都使用了它们,但这并没有规避您只为两种类型的模板专业化提供了一个类型参数的事实。

于 2012-10-08T18:06:37.910 回答