简体   繁体   中英

C++: partial specialization of template template classes

The following code:

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

}

gives me a compiler error:

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

Why can't I partially specialize foo1() ? If this is not the way, how do I do this?

I have another question: what if I want foo2() to be defined only for A=int, B=Hoo and not for any other combination, how do I do that?

Function templates may only be fully specialized, not partially.

Member functions of class templates are automatically function templates, and they may indeed be specialized, but only fully:

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

You can partially specialise the entire class and then define it anew:

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

(See 14.7.3 for details.)

The template still has two parameters, and you must write something like this:

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

The default has been specified, and only needs to be specified once. From then on, it's just like any other two-parameter template. This code will apply no matter what B is (defaulted or otherwise). If you then wish to specify different behaviour for a particular B, then you do specialization of the class, not just of a method.

( Heavily edited )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM