ゆとりーなの日記

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

VC++はやはりdisられなければならないようだ

昨日の話の派生系です。全うなコンパイラならばテンプレート化した基底クラスの中まで名前を見てくれないのです。
というわけで、

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

  void foo() {}
};

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

int main() {
  const derived<int> d(0);
  return 0;
}

に於いて、「't' : 引数は関数の本体部で 1 度も参照されません。」という警告を吐いてコンパイルに成功してしまうVC++は矢張り以下略と言わざるを得ません。

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

  void foo() {}
};

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

int main() {
  const derived<int> d(0);
  return 0;
}

この様に書くことで全うなコンパイラでもコンパイルが通るようになります。幸いにもVC++でもこのコードはコンパイルが通るので手を抜かずに名前修飾はちゃんとしてあげるといいのではないですかね。