#include class A {}; class B {}; class C {}; class D { operator C() const { return C(); } }; typedef boost::variant< A, B > variant_type; void f( variant_type const& ){} void f( C const& ){} int main() { f( A() ); f( B() ); f( C() ); f( D() ); // ambiguous call to overloaded function }