C++:模板模板类的部分特化

use*_*536 8 c++ templates template-specialization

以下代码:

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();

}
Run Code Online (Sandbox Code Playgroud)

给我一个编译器错误:

test.cc:18: error: invalid use of incomplete type 'struct Foo<A, Goo>'
test.cc:11: error: declaration of 'struct Foo<A, Goo>'
Run Code Online (Sandbox Code Playgroud)

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

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

Ker*_* SB 5

功能模板可能仅是完全专用的,而不是部分专用的。

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

template <>
void Foo<int, Goo>::foo1() { }  // OK
Run Code Online (Sandbox Code Playgroud)

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

template <typename A>
struct Foo<A, Goo>
{
  // ...
};
Run Code Online (Sandbox Code Playgroud)

(有关详细信息,请参见14.7.3。)