#include <functional>
using namespace std;

/* a function template */
template <typename A, typename B>
A f(B) { return A(); }

/* a class template */
template <typename A, typename B>
class X {};

template <typename A, typename B>
class Y
{
  /** All these constructors fail to compile **/
  
  Y(X<A,B> = X<A,B>())
  //Y(A (*arg)(B) = f<A, B>)
  //Y(std::function<A(B)> arg = f<A, B>)
  { }
};

int main()
{ return 0; }