#ifndef PROBLEMEXAMPLE_HPP
#define PROBLEMEXAMPLE_HPP
template<class T>
struct Traits{};
template <class P>
class A;
template <class P>
typename Traits<A<P> >::result_type
f(A<P>& a);
template <class P>
class A{
int val;
typedef double result_type;
friend struct Traits<A<P> >;
friend
typename Traits<A<P> >::result_type
(::f<>)(A<P>& a);
};
template<class P>
struct Traits<A<P> >{
typedef typename A<P>::result_type result_type;
};
template <class P>
typename Traits<A<P> >::result_type
f(A<P>& a){
return a.val;
}
#endif // PROBLEMEXAMPLE_HPP