複数のキャストが存在するクラスの operator<< があいまいで解決できないという話

とあるクラスに int と double のキャストオペレーターが定義されている。このためユニットテストフレームワークが生成する operator<< があいまいになりコンパイルできず困る、という話を伝え聞いた。そんなときは operator<< オーバーロードを定義すればいいんじゃない?

#include <iostream>

struct Foo {
  operator int() const { return 0; }
  operator double () const { return 1; }
};

namespace {
  std::ostream& operator<< (std::ostream& o, const Foo& v)
  { return o << static_cast<int>(v); }
} // operator<< の解決を強制する

int main() {
  std::cout << Foo() << std::endl;
  return 0;
}

こういう問題への解決を考えることが好き。