依存名とtypename

Faith and Brave - C++で遊ぼうより


規格準拠度が高いとされるComeauですら、この種のバグをもっているだよねぇ。

#include <iostream>
struct foo_tag{};
struct bar_tag{};
struct foo
{
  typedef foo_tag tag;
};
struct bar
{
  typedef bar_tag tag;
};

template <class T>void baz(const T&x, foo_tag)
{
  std::cout << "foo_tag" << std::endl;
}
template <class T>void baz(const T&x, bar_tag)
{
  std::cout << "bar_tag" << std::endl;
}

template <class T>
void baz(const T&x)
{
  baz(x, typename T::tag()); // typenameを削除しても Comeauですらコンパイルできる。
}

int main(int argc, char *argv[])
{
  baz(foo());
  baz(bar());
  return 0;
}