依存名とtypename
規格準拠度が高いとされる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; }