#include <iostream>

template <class T>
class A {
  T d;
public:
  A(T a) : d(a) {}
  template<class U, class V>
  friend auto operator*(U& x, V& y) -> decltype(U::d * V::d);
};

template<class T, class U>
auto operator*(T& x, U& y) -> decltype(T::d * U::d)
{
  return x.d * y.d;
}

int main()
{
  A<double> a(3.0);
  A<int> b(5);

  std::cout << a * b << std::endl;
}