C++:模板模板类的部分专用化

C++: partial specialization of template template classes

本文关键字:专用 C++      更新时间:2023-10-16

以下代码:

using namespace std;
template <typename X>
class Goo {};

template <typename X>
class Hoo {};

template <class A, template <typename> class B = Goo >
struct Foo {
  B<A> data;
  void foo1();
  void foo2();
};

template <typename A>
void Foo<A>::foo1() { cout << "foo1 for Goo" << endl;}

int main() {
  Foo<int> a;
  a.foo1();
}

给我一个编译器错误:

test.cc:18: error: invalid use of incomplete type 'struct Foo<A, Goo>'
test.cc:11: error: declaration of 'struct Foo<A, Goo>'

为什么我不能部分专门化foo1()?如果不是这样,我该怎么做?

我还有一个问题:如果我只想为A=int,B=Hoo定义foo2(),该怎么办而不是任何其他组合,我该怎么做?

函数模板只能是完全专用的,而不能是部分专用的。

类模板的成员函数是自动的函数模板,它们可能确实是专门的,但只是完全的:

template <>
void Foo<int, Goo>::foo1() { }  // OK

您可以部分专门化整个,然后重新定义它:

template <typename A>
struct Foo<A, Goo>
{
  // ...
};

(详见14.7.3。)

模板仍然有两个参数,您必须这样写:

template <typename A, template <typename> class B>
void Foo<A,B>::foo1() { cout << "foo1" << endl;}

默认值已经指定,并且只需要指定一次。从那时起,它就像其他任何两个参数的模板一样。无论B是什么(默认值还是其他值),此代码都将适用。如果您希望为特定的B指定不同的行为,,则将对类进行专门化,而不仅仅是对方法进行专门化。

经过大量编辑