読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

disりすぎはよくない

テンプレートなクラスを継承したときの、基底クラスへのアクセス方法に就いての話です。
普通に書くとこうなります。

template <typename T>
class base {
 public:
  explicit base(const T &t) {}
};

template <typename T>
class derived : base<T> {
 public:
  explicit derived(const T &t) : base<T>(t) {}
};

VC++ではこの様な書き方が出来ます。

template <typename T>
class derived : base<T> {
 public:
  explicit derived(const T &t) : base(t) {}
};

これはg++では出来ない書き方です。この書き方がうれしいのは例えばBoostのiterator_adaptorとかを継承したときで、これをテンプレート引数全部書いてたらだるいだろうとか思うんですが、Let's Boostさん等の頁ではきちんと派生クラスアクセスにテンプレート引数を書いているので規格的には全部書くほうが正しいんだろうなぁと思っていたわけです。
ところがn3242の353頁辺りを見ると、どうもテンプレート引数は書かなくてもいい様に見えます。実際g++も-std=c++0xを付けると下の書き方でもコンパイルが通るようになります。
また例によってVC++の規格無視かとか思ってたんですが、今回ばかりはどうもそうではないみたいです。
追記:
g++も-std=c++0xを付けると下の書き方でもコンパイルが通るというのは間違いでした。以下修正です。

template <typename T>
class derived : public base<T> {
 public:
  explicit derived(const T &t) : derived::base(t) {}
};

というかそもそも-std=c++0xは関係ないみたいです。あと、private継承でも別に問題はないと思います。