Let's start Scheme

2006-12-13

クラステンプレートの継承

なんか、ここのブログはところどころ白いページになってるなぁ。
なんでだろう?

C++でクラステンプレートの継承を行いたい。
(たい、と言っているということは上手くできていない)
普通のは当然できる。
こんなの
template< typename T >
class base
{ };

template< class T >
class herit
     : base< T >
{ };
これは予定通り上手くできるんだけど、
こんなのがインナークラスとかが絡んでくると上手くいかない。
こんなの
template< typename T >
class base
{
  template< typename I >
  struct inner_base
  { }:
};

template< class T >
class herit
     : base< T >
{
  template< class I >
  struct inner_herit
        : base< T >::inner_base< I > // これがダメっぽい
  { };
};
理由としては、テンプレートの特殊化(だったかな用語)を行う時に、
テンプレート内にあるテンプレートの場合はtypenameのキーワードが必要らしい。
(この辺はD&Eだったか、Modern C++ Designに書いてあったかな)
つまりインナークラスの継承の部分が
typename base< T >::inner_base< I >
と書ければいけるような気がするんだけど、
コンパイラの中の人がそんな文法は存在しないといって怒ってくる。
こんな面倒なことしなければいいんだけど、
spiritのgrammarクラスの中にはdefinitionってクラスがあって、
こいつの継承も行わないといけないんだよね。
ってことはクラステンプレートの継承を2回行う必要があるんだけど、
上記のエラーが出て上手くいかない。
別の方法を考えるしかないだろうか・・・
誰かいい方法知りませんか?

No comments:

Post a Comment